这里讨论的主要有j.u.Collections
与j.u.Arrays
两个类,分别对应集合与数组。在实际开发中可能或多或少已经用过这两个类,如今让咱们看看里面还有哪些可用的方法吧。面试
sort(…)
一个是要求List的容器中元素已经实现了j.l.Comparable<T>
类,内部调用的是Arrays.sort(…)
,而后从新赋值。 而j.l.Comparable<T>
接口中只有一个compareTo(T a)
方法,实现了这个类,就能够调用这个方法,进行简单排序。 另外一个必须传入一个比较器实例,实现了j.u.Comparator<T>
接口的类,其内部也是调用Arrays.sort(…)
,有点须要注意的是这里是典型的策略模式。j.l.Comparable
接口,而且是有序的。binarySearch(…)
根据传入的参数是否支持随机访问(经过实现RandomAccess
接口),分别来分发到indexedBinarySearch(…)
与iteratorBinarySearch(…)
,能够看到不支持随机访问的iteratorBinarySearch(…)
只能开始一个个遍历到index
位置,效率有点慢。reverse(…)
能够将List元素相反的顺序从新排列。shuffle(…)
将全部List元素顺序随机打乱。这个算法在网上有面试题,下次能够直接调用JDK算法。swap(…)
交换List的两个元素。fill(…)
用一个元素填充一个List,可是要注意List的size。copy(…)
将一个List元素从一个List交复制到另外一个List。min(…)
求容器元素实现了j.l.Comparable
接口的Collection中最小的值,比值操做函数是compareTo
。max(…)
与求最小值相相似。rotate(…)
,能够这样理解,就是将一个List的头与尾巴连接,造成一个环,而distance
表示后退distance
步,而后断开环。 rotate({1,2,3,4} ,1)-> ({4,1,2,3})
replaceAll(…)
,这个比较容易理解。indexOfSubList
与lastIndexOfSubList(…)
,求子集合第一次与最后一次出现的位置。disjoint(…)
,也就是判断两个集合有没有交际。frequency(…)
,统计一个元素在集合中出现的次数。reverseOrder(…)
,返回一个反向排序比较器,反序排列的时候可用。CheckedCollection
、CheckedList
、CheckedMap
、CheckedRandomAccessList
、CheckedSet
、CheckedSortedMap
、CheckedSortedSet
。 做用是对集合的容器元素作类型的限制,由于在集合的传递中,可能出现泛型的擦除,能够看看这篇文章。EmptyEnumeration
、EmptyList
、EmptyMap
、EmptySet
。 空的集合,大小不可变,下降对系统资源的消耗,如在查询数据库时,没有数据或出错的时候返回一个默认List值,这时候能够用EmptyList。参考可见这篇文章。内部实现readResolve()
用于对单例模式的保护.SingletonList
、SingletonMap
、SingletonSet
。只有一个元素的集合,大小不可变。做用……嗯……就是这个集合只准有一个元素……好吧,我也不知道有其余的用处……UnmodifiableCollection
、UnmodifiableList
、UnmodifiableMap
、UnmodifiableRandomAccessList
、UnmodifiableSet
、UnmodifiableSortedMap
、UnmodifiableSortedSet
。不可修改的集合,外表与不可变集合同样,可是一般须要另外一个集合初始化,而这个传入的集合能够是可修改的,相似代理模式吧,能够看看这篇文章SynchronizedCollection
、SynchronizedList
、SynchronizedMap
、SynchronizedRandomAccessList
、SynchronizedSet
、SynchronizedSortedMap
、SynchronizedSortedSet
。线程安全的集合,须要传入一个集合(也可传入要锁对象),内部就是对锁对象加锁,而后进行对集合的操做。和上面的有些相似,代理模式。注意的是,线程安全是对SynchronizedCollection
等而言,对于初始化时传入的集合,若是直接对他进行操做也是不安全的。没有太大变动,最明显的是各内部子类增长了stream相关接口。算法
asList(…)
,这是你们最经常使用的吧,可是要注意,他返回的ArrayList
是他的一个内部类,而不是常见的j.u.ArrayList
。binarySearch(…)
。能给各类数组查找,可是前提是他们得是有序的。copyOf(…)
, 从入参original
拷贝出newLength
长度的数组(若是不足就取original的长度)。调用的是System.arraycopy(…)
。copyOfRange(…)
, 从入参original
拷贝出to - from
长度的数组。内部调用的是System.arraycopy(…)
。deepEquals(…)
,对全部容器元素作equals(…)
,若是数组元素是数组那么递归deepEquals(…)
。deepToString(…)
,将循环调用数组(A)数组元素的toString(…)
方法,若是数组元素是数组(B),那么会再次循环调用此数组(B)数组元素的toString(…)
方法,但不会在数组(B)上调用deepToString(…)
。equals(…)
,将两个入参数组a与a2的全部元素逐个对比。包括顺序。fill(…)
,将一个数组a填充val值,你可也以制定填充的开始位置与结束位置。hashCode(…)
,获得一个数组的哈希值,他与数组的元素与顺序相关。deepToString(…)
,与hashCode(…)
不一样,若是数组元素是数组,那么就会递归调用deepToString(…)
。sort(…)
,快速排序,内部调用的是j.u.DualPivotQuicksort
类,感兴趣的能够看看。toString(…)
,将循环调用数组(A)数组元素的toString(…)
方法。j.u.ArrayList
同名,Arrays.asList(…)
的时候返回的就是这个类实例,注意不要给j.u.ArrayList
了。parallelPrefix(…)
,根据传入的表达式,对传入的数组进行演算,将上次演算的结果作为下次演算的一个因子,将此因子与数组下标对应的元素再次演算,如此循环,将每次若是放到新数组中。parallel表示他是并行的。parallelSort(…)
,并行排序,将数组分红小数组,分别排序,而后合并。他内部有一个阈值,若是不到并行排序的条件就会降级成sort(…)
。setAll(…)
,根据传入的表达式对全部数组元素进行演算,并设值。parallelSetAll(…)
,上面函数的并行版本。stream(…)
,将传入的数组,流化。嗯,对,就叫流化……spliterator(…)
,听说是splite版本的iterator,我没有看懂,你们看看吧。