1. JDK中集合的辅助类

JDK中集合的辅助类

这里讨论的主要有j.u.Collectionsj.u.Arrays两个类,分别对应集合与数组。在实际开发中可能或多或少已经用过这两个类,如今让咱们看看里面还有哪些可用的方法吧。面试

Collections的方法

  1. 两个排序。sort(…) 一个是要求List的容器中元素已经实现了j.l.Comparable<T>类,内部调用的是Arrays.sort(…),而后从新赋值。 而j.l.Comparable<T>接口中只有一个compareTo(T a)方法,实现了这个类,就能够调用这个方法,进行简单排序。 另外一个必须传入一个比较器实例,实现了j.u.Comparator<T>接口的类,其内部也是调用Arrays.sort(…),有点须要注意的是这里是典型的策略模式
  2. 二分查找。须要内部的list实现j.l.Comparable接口,而且是有序的。binarySearch(…) 根据传入的参数是否支持随机访问(经过实现RandomAccess接口),分别来分发到indexedBinarySearch(…)iteratorBinarySearch(…),能够看到不支持随机访问的iteratorBinarySearch(…)只能开始一个个遍历到index位置,效率有点慢。
  3. 反序。reverse(…)能够将List元素相反的顺序从新排列。
  4. 洗牌。shuffle(…)将全部List元素顺序随机打乱。这个算法在网上有面试题,下次能够直接调用JDK算法。
  5. 交换。swap(…)交换List的两个元素。
  6. 填充。fill(…)用一个元素填充一个List,可是要注意List的size。
  7. 复制。copy(…)将一个List元素从一个List交复制到另外一个List。
  8. 求最小值。min(…)求容器元素实现了j.l.Comparable接口的Collection中最小的值,比值操做函数是compareTo
  9. 求最大值,max(…)与求最小值相相似。
  10. 反转。rotate(…),能够这样理解,就是将一个List的头与尾巴连接,造成一个环,而distance表示后退distance步,而后断开环。 rotate({1,2,3,4} ,1)-> ({4,1,2,3})
  11. 替换元素。replaceAll(…),这个比较容易理解。
  12. 子集合位置。indexOfSubListlastIndexOfSubList(…),求子集合第一次与最后一次出现的位置。
  13. 集合互斥。disjoint(…),也就是判断两个集合有没有交际。
  14. 出现次数。frequency(…),统计一个元素在集合中出现的次数。
  15. 反向排序比较器。reverseOrder(…),返回一个反向排序比较器,反序排列的时候可用。

Collections中的内部类。

  1. Checked系列。包括CheckedCollectionCheckedListCheckedMapCheckedRandomAccessListCheckedSetCheckedSortedMapCheckedSortedSet。 做用是对集合的容器元素作类型的限制,由于在集合的传递中,可能出现泛型的擦除,能够看看这篇文章
  2. Empty系列。包括EmptyEnumerationEmptyListEmptyMapEmptySet。 空的集合,大小不可变,下降对系统资源的消耗,如在查询数据库时,没有数据或出错的时候返回一个默认List值,这时候能够用EmptyList。参考可见这篇文章。内部实现readResolve()用于对单例模式的保护.
  3. Singleton系列。SingletonListSingletonMapSingletonSet。只有一个元素的集合,大小不可变。做用……嗯……就是这个集合只准有一个元素……好吧,我也不知道有其余的用处……
  4. Unmodifiable系列。UnmodifiableCollectionUnmodifiableListUnmodifiableMapUnmodifiableRandomAccessListUnmodifiableSetUnmodifiableSortedMapUnmodifiableSortedSet。不可修改的集合,外表与不可变集合同样,可是一般须要另外一个集合初始化,而这个传入的集合能够是可修改的,相似代理模式吧,能够看看这篇文章
  5. Synchronized系列。SynchronizedCollectionSynchronizedListSynchronizedMapSynchronizedRandomAccessListSynchronizedSetSynchronizedSortedMapSynchronizedSortedSet。线程安全的集合,须要传入一个集合(也可传入要锁对象),内部就是对锁对象加锁,而后进行对集合的操做。和上面的有些相似,代理模式。注意的是,线程安全是对SynchronizedCollection等而言,对于初始化时传入的集合,若是直接对他进行操做也是不安全的。

Collections的JDK8

没有太大变动,最明显的是各内部子类增长了stream相关接口。算法

Arrays的方法

  1. 数组变列表。asList(…),这是你们最经常使用的吧,可是要注意,他返回的ArrayList是他的一个内部类,而不是常见的j.u.ArrayList
  2. 二分查找系列。binarySearch(…)。能给各类数组查找,可是前提是他们得是有序的。
  3. 定长复制。copyOf(…), 从入参original拷贝出newLength长度的数组(若是不足就取original的长度)。调用的是System.arraycopy(…)
  4. 范围复制。copyOfRange(…), 从入参original拷贝出to - from长度的数组。内部调用的是System.arraycopy(…)
  5. 深度相等。deepEquals(…),对全部容器元素作equals(…),若是数组元素是数组那么递归deepEquals(…)
  6. 深度字串化。deepToString(…),将循环调用数组(A)数组元素的toString(…)方法,若是数组元素是数组(B),那么会再次循环调用此数组(B)数组元素的toString(…)方法,但不会在数组(B)上调用deepToString(…)
  7. 数组相等。equals(…),将两个入参数组a与a2的全部元素逐个对比。包括顺序。
  8. 填充。fill(…),将一个数组a填充val值,你可也以制定填充的开始位置与结束位置。
  9. 哈希值。hashCode(…),获得一个数组的哈希值,他与数组的元素与顺序相关。
  10. 深度哈希值。deepToString(…),与hashCode(…)不一样,若是数组元素是数组,那么就会递归调用deepToString(…)
  11. 排序。sort(…),快速排序,内部调用的是j.u.DualPivotQuicksort类,感兴趣的能够看看。
  12. 字串化。toString(…),将循环调用数组(A)数组元素的toString(…)方法。

Arrays的内部类

  1. ArrayList类,与j.u.ArrayList同名,Arrays.asList(…)的时候返回的就是这个类实例,注意不要给j.u.ArrayList了。

Arrays的JDK8

  1. 前缀相累,parallelPrefix(…),根据传入的表达式,对传入的数组进行演算,将上次演算的结果作为下次演算的一个因子,将此因子与数组下标对应的元素再次演算,如此循环,将每次若是放到新数组中。parallel表示他是并行的。
  2. 并行排序,parallelSort(…),并行排序,将数组分红小数组,分别排序,而后合并。他内部有一个阈值,若是不到并行排序的条件就会降级成sort(…)
  3. 设值全部,setAll(…),根据传入的表达式对全部数组元素进行演算,并设值。
  4. 并行设值全部,parallelSetAll(…),上面函数的并行版本。
  5. 流化。stream(…),将传入的数组,流化。嗯,对,就叫流化……
  6. spliterator(…),听说是splite版本的iterator,我没有看懂,你们看看吧。
相关文章
相关标签/搜索