Collections、Arrays 简明
Collections :
它的出现给集合操作提供了更多的功能。这个类不需要创建对象,内部提供的都是静态方法。
一般方法
Collections. sort (list);
list 集合进行元素的自然顺序排序。
Collections. sort(list, new AComparator ());
按指定的比较器方法排序。
class AComparatorByLen implements Comparator<String>{
public int compare(String s1,String s2){
int temp = s1.length()-s2.length();
return temp == 0 ? s1.compareTo(s2) : temp;
}
}
Collections. max (list);
返回 list 中自然顺序最大的元素。
Collections. max (list, new AComparator());
根据指定比较器产生的顺序,返回list 中最大的元素。
Collections. min(list);
//返回 list 中自然顺序最小的元素。
Collections. max (list, new AComparator());
根据指定比较器产生的顺序,返回list 中最小的元素。
Collections. binarySearch (list,"zz");
二分查找,返回角标。
Collections. reverseOrder ();
逆向反转排序。
Collections. shuffle (list);
使用默认随机源对指定列表进行置换。
Collections.nCopies(int n, T o)
返回由指定对象的 n 个副本组成的不可变列表
//字符串只存储了一次,付出的储存代价很小。
List<String> settings = Collections.nCopies(100, "DEFAULT");
Collections.singleton(T o)
返回一个只包含指定对象的不可变的单元素集 set。不需要付出建立数据结构的开销,相似还有,singletonList(T o)
与singletonMap(K key, V value)
返回不可修改视图
static <T> Collection<T> unmodifiableCollection(Collection<? extends T> c)
返回指定 collection 的不可修改视图。
static <T> List<T> unmodifiableList(List<? extends T> list)
返回指定列表的不可修改视图。
static <K,V> Map<K,V> unmodifiableMap(Map<? extends K,? extends V> m)
返回指定映射的不可修改视图。
static <T> Set<T> unmodifiableSet(Set<? extends T> s)
返回指定 set 的不可修改视图。
static <K,V> SortedMap<K,V> unmodifiableSortedMap(SortedMap<K,? extends V> m)
返回指定有序映射的不可修改视图。
static <T> SortedSet<T> unmodifiableSortedSet(SortedSet<T> s)
返回指定有序 set 的不可修改视图。
List <String> staff = new LinkedList<>();
...
lookAt(Collections.unmodifiableList(staff));
Collections.unmodifiableList
方法将返回一个实现了List
接口的对象。其访问器方法从staff
集合中读取值。lookAt
方法也可以调用List
接口中的所有方法,但所有的更改器方法功能已经被重新定义成了只抛出UnsupportedOperationException异常。- 由于视图只是包装了接口,所以只能访问接口中定义的方法。例如
addFirst
和addLast
它们不是List
接口中的方法,而是LinkedList
类中的方法。
同步视图
类库的设计者使用视图机制来确保常规集合的线程安全,而不是使用实现了线程安全的集合类。
原理:定义一个类,将集合所有的方法加同一把锁后返回。
static <T> Collection<T> synchronizedCollection(Collection<T> c)
返回指定 collection 支持的同步(线程安全的)collection。
static <T> List<T> synchronizedList(List<T> list)
返回指定列表支持的同步(线程安全的)列表。
static <K,V> Map<K,V> synchronizedMap(Map<K,V> m)
返回由指定映射支持的同步(线程安全的)映射。
static <T> Set<T> synchronizedSet(Set<T> s)
返回指定 set 支持的同步(线程安全的)set。
static <K,V> SortedMap<K,V> synchronizedSortedMap(SortedMap<K,V> m)
返回指定有序映射支持的同步(线程安全的)有序映射。
static <T> SortedSet<T> synchronizedSortedSet(SortedSet<T> s)
返回指定有序 set 支持的同步(线程安全的)有序 set。
检查视图
ArrayList<String> strings = new ArrayList<>();
ArrayList rawList = strings;
rawList.add(new Employee("tommy")); //now strings contains a Employee object.
System.out.println(rawList.get(0));
outPut:
Employee [name=tommy, getName()=tommy, getClass()=class collections.Employee, hashCode()=118352462, toString()=collections.Employee@70dea4e]
检查视图可以探测到这类问题:
List<String> safeStrings = Collections.checkedList(strings, String.class);
ArrayList rawList2 = safeStrings;
System.out.println(rawList2);
outPut:
java.lang.ClassCastException: Attempt to insert class java.util.Date element into collection with element type class java.lang.String
视图局限性:
- 通常可能只能读、无法改变大小、只支持删除不支持插入。
Collection 和Collections 的区别 :
- Collections 是个
java.util
下的类,是针对集合类的一个工具类,提供一系列静态方法,实现对集合的查找、排序、替换、线程安全化(将非同步的集合转换成同步的)等操作。 - Collection 是个
java.util
下的接口,它是各种集合结构的父接口,继承于它的接口主要有 Set 和 List,提供了关于集合的一些操作,如插入、删除、判断一个元素是否其成员、遍历等。
Arrays :
用于操作数组对象的工具类,方法皆为静态方法。
- asList(T... a) 方法
返回普通Java数组的List包装器,返回的对象不是ArrayList
,而是一个带有访问底层数组的get 和set方法的视图对象。改变底层数组的所有方法,如与迭代器相关的add
和remove
方法,会直接抛出不支持操作异常UnsupportedOperationException
。
String[] values = {"aaa","bbb","ccc","ddd"}; //a array
List<String> list = Arrays.asList(values); //a list
HashSet<String> staff = new HashSet<>(Arrays.asList(values)); //a set
- 将数组转换成集合有什么好处呢?
用asList(T... a)
方法,将数组转换成集合后可以用集合中的方法来操作数组中的元素:isEmpty()
、contains(Object o)
、indexOf(Object o)
、set(int index, E element)
。 - 如果数组中存储的是引用数据类型,这些引用对象直接作为列表的元素。
- 如果数组中存储的是基本数据类型,
asList(T... a)
会将这个数组对象作为参数传入方法中,这样,列表中就仅有一个元素。
int[] ints = {1,2,3,4,5};
List list = Arrays.asList(ints);
System.out.println("the size of list is:" + list.size());
outPut:
the size of list is:1
asList(T... a)
接受的参数是一个泛型的变长参数,我们知道基本数据类型是无法发型化的,也就是说 8 个基本类型是无法作为asList(T... a)
的参数的, 要想作为泛型参数就必须使用其所对应的包装类型。这里, int 类型的数组当做其参数,而在 Java 中数组是一个对象,它是可以泛型化的,所以列表的长度为1.
//将 int 改变为 Integer
Integer[] ints = {1,2,3,4,5};
List list = Arrays.asList(ints);
System.out.println("list'size:" + list.size());
outPut:
the size of list is:5
- 集合转数组: 用的是 Collection 接口中的 toArray()方法;
String[] val = staff.toArray(new String[0]); //a array
- 如果给 toArray 传递的指定类型的数据长度小于了集合的 size,那么
toArray
方法,会自定再创建一个该类型的数据,长度为集合的 size。 - 如果传递的指定的类型的数组的长度大于了集合的 size,那么
toArray
方法,就不会创建新数组,直接使用该数组,并将集合中的元素存储到数组中,其他为存储元素的位置默认值 null。所以,在传递指定类型数组时,最好的方式就是指定的长度和 size 相等的数组。 - 将集合转成数组的好处是限制了集合中的元素的增删操作。
(-̇᷇̂ᴥ ̇᷇̂-)(-̇᷇̂ᴥ ̇᷇̂-)(-̇᷇̂ᴥ ̇᷇̂-)不要克制,喜欢就顶(୨୧•͈ᴗ•͈)◞ᵗʱᵃᵑᵏઽ
——@guoyangde http://www.cnblogs.com/LittleTreasureBox/p/8904016.html
Collections、Arrays 简明的更多相关文章
- 【集合框架】JDK1.8源码分析之Collections && Arrays(十)
一.前言 整个集合框架的常用类我们已经分析完成了,但是还有两个工具类我们还没有进行分析.可以说,这两个工具类对于我们操作集合时相当有用,下面进行分析. 二.Collections源码分析 2.1 类的 ...
- Java笔记(二十四)……集合工具类Collections&Arrays
Collections 集合框架的工具类,方法全部为静态 Collections与Collection的区别 Collection是集合框架的一个顶层接口,里面定义了单列集合的共性方法 Collect ...
- Java容器类Collection,List,Set,Map.,Iterator,Collections工具类,Arrays工具类,Comparable
Java容器类Collection,List,Set,Map.,Iterator,Collections工具类,Arrays工具类,Comparable接口,泛型 Collection,List,Se ...
- Java.utils.Collections学习
阅读类库代码是有意义的,尤其是Java集合类框架以及算法Collections Arrays都是值得阅读的, 一来可以减少新手程序员的编码的工作量,二来,对于常见的需求,程序员应该先找下是否有现成的类 ...
- 从一道例题谈Arrays.toString()与其他String的转换方法
阅读该篇文章前,请大家事先阅读一下: java.toString(),(String),String.valueOf的区别 有了上述基础后,我接下来谈谈从一道题目中获得的些许收获. 今天在做题是发 ...
- Java的哪些事
Java的哪些事--------------------------------------------------Java学习分2个方面: Java语法与Java类库 Java: A simple, ...
- JAVA集合类型详解
一.前言 作为java面试的常客[集合类型]是永恒的话题:在开发中,主要了解具体的使用,没有太多的去关注具体的理论说明,掌握那几种常用的集合类型貌似也就够使用了:导致这一些集合类型的理论有可能经常的忘 ...
- 【集合框架】Java集合框架综述
一.前言 现笔者打算做关于Java集合框架的教程,具体是打算分析Java源码,因为平时在写程序的过程中用Java集合特别频繁,但是对于里面一些具体的原理还没有进行很好的梳理,所以拟从源码的角度去熟悉梳 ...
- Spring Boot文档阅读
原因之初 最初习惯百度各种博客教程,然后跟着操作,因为觉得跟着别人走过的路走可以少走很多弯路,省时间.然而,很多博客的内容并不够完整,甚至错误,看多了的博客甚至有千篇一律的感觉.此外,博客毕竟是记载博 ...
随机推荐
- 笔记:Maven 插件及配置详解
插件使用配置 用户能够自己选择将某个插件目标绑定到生命周期的某个阶段上,例如创建项目的源码JAR包,内置的插件绑定关系并没有涉及这个任务,mavent-source-plugin 可以帮助我们完成该任 ...
- 前端的UI设计与交互之导航篇
在广义上,任何告知用户他在哪里,他能去什么地方以及如何到达那里的方式,都可以称之为导航.当设计者使用导航或者自定义一些导航结构时,请注意:尽可能提供标识.上下文线索,避免用户迷路:保持导航样式和行为一 ...
- Explain
explain关键字 explain关键字一般放在SELECT查询语句的前面,用于描述MySQL如何执行查询操作.以及MySQL成功返回结果集需要执行的行数.explain 可以帮助我们分析 sele ...
- Sagit.Framework For IOS 开发框架入门教程5:消息弹窗STMsgBox
前言: 昨天刚写了一篇IT连创业的文章:IT连创业系列:产品设计之答题模块,(欢迎大伙关注!) 感觉好久没写IOS的文章了,今天趁机,来补一篇,Sagit的教程. Sagit 开源地址:https:/ ...
- android中xml tools属性详解(转)
第一部分 安卓开发中,在写布局代码的时候,ide可以看到布局的预览效果. 但是有些效果则必须在运行之后才能看见,比如这种情况:TextView在xml中没有设置任何字符,而是在activity中设置了 ...
- 关于css的text-indent首行缩进两个字符和图片缩进的问题
段落前面空两个字的距离,不要再使用空格了.应该使用首行缩进text-indent. text-indent可以使得容器内首行缩进一定单位.比如中文段落一般每段前空两个汉字. <style typ ...
- 201621123043《java程序设计》第五周学习总结
1. 本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词 接口. Comparable接口 .Comparator接口.compareTo. 1.2 尝试使用思维导图将这些关键词组织起来 ...
- 团队作业4——第一次项目冲刺(Alpha版本)
第一天http://www.cnblogs.com/ThinkAlone/p/7861070.html 第二天http://www.cnblogs.com/ThinkAlone/p/7861191.h ...
- class AClass<E extends Comparable>与class AClass<E extends Comaprable<E>>有什么区别?
new ArrayList<>()与new ArrayList()一样 都是为了做限定用的 如果不了解你可以看API 这个Comparable里面有一个方法compareTo(T o) 如 ...
- TCP/IP协议复习