下文笔者将讲述java集合类中常用的工具类简介说明,如下所示
Java中的集合类既可以当做放其他数据的容器 又可以当做常见的数据结构使用 Java中提供了很多好用的工具类来操作这些集合类
java常用工具类说明
JDK本身提供的工具类 Guava提供的工具类 Apache common-Collection提供的工具类
JDK提供的工具类
Arrays Collections Objects Arrays是操作数组对象的工具类 Collections是操作集合对象的工具类 Objects是操作引用数据类型对象的工具类
Arrays的常用方法
普通排序
Arrays.sort(int[] a)
Arrays.sort(int[] a, int fromIndex, int toIndex)
并行排序:JDK1.8新增
Arrays.parallelSort(int[] a)
Arrays.parallelSort(int[] a, int fromIndex, int toIndex)
并行计算:
JDK1.8新增
支持函数式编程
根据传入的方法进行一次计算
Arrays.parallelPrefix(int[] array, IntBinaryOperator op)
Arrays.parallelPrefix(int[] array, int fromIndex, int toIndex, IntBinaryOperator op)
二分法查找
前提是该数组已经进行了排序
Arrays.binarySearch(int[] a, int key)
Arrays.binarySearch(int[] a, int fromIndex, int toIndex, int key)
判断两个数组是否相等
Arrays.equals(int[] a, int[] a2)
对数组进行填充
Arrays.fill(int[] a, int val)
Arrays.fill(int[] a, int fromIndex, int toIndex, int val)
复制数组
Arrays.copyOf(int[] original, int newLength)
返回赋值后的数组,数组长度为newLength。
Arrays.copyOfRange(int[] original, int from, int to)
toString
将元素用","隔开
包裹在"[ ]"内
Arrays.toString(int[] a)
Arrays.deepToString(Object[] a)方法内部调用了a.toString()。
更改元素值
JDK1.8新增
支持函数式编程
setAll(int[] array, IntUnaryOperator generator)
setAll(long[] array, IntToLongFunction generator)
setAll(double[] array, IntToDoubleFunction generator)
setAll(T[] array, IntFunction<? extends T> generator)
数组转集合
Arrays.asList(T... a) 返回List<T>
生成并行遍历Spliterator
JDK1.8新增
Arrays.spliterator(int[] array)
Arrays.spliterator(int[] array, int startInclusive, int endExclusive)
int、long、double和实现了Spliterator接口的类具有该类型方法
生成Stream类
JDK1.8新增
Arrays.stream(int[] a)
Arrays.stream(int[] array, int startInclusive, int endExclusive)
int、long、double和实现了Stream接口的类具有该类型方法。
Collections的常用方法
排序
Collections.sort(List list)
T或其父类需要实现Comparable接口
Collections.sort(List list, Comparator<? super T> c)
Collections.sort()的源码
public static <T> void sort(List<T> list, Comparator<? super T> c) {
list.sort(c);
}
List.sort()源码
default void sort(Comparator<? super E> c) {
Object[] a = this.toArray();
Arrays.sort(a, (Comparator) c); // 调用Arrays.sort()来进行排序
ListIterator<E> i = this.listIterator();
for (Object e : a) {
i.next();
i.set((E) e);
}
}
注意事项: Collections.sort()最终调用的是Arrays.sort()进行排序。
查到索引
Collections.binarySearch(List<? extends Comparable<? super T>> list, T key) Collections.binarySearch(List<? extends T> list, T key, Comparator<? super T> c)
顺序反转
Collections.reverse(List<?> list)
乱序 Collections.shuffle(List<?> list)
指定元素互换
Collections.swap(List<?> list, int i, int j)
填充
Collections.fill(List<? super T> list, T obj)
复制
Collections.copy(List<? super T> dest, List<? extends T> src)
求最大值最小值
Collections.min(Collection<? extends T> coll)
Collections.min(Collection<? extends T> coll, Comparator<? super T> comp)
Collections.max(Collection<? extends T> coll)
Collections.max(Collection<? extends T> coll, Comparator<? super T> comp)
转动元素
Collections.rotate(List<?> list, int distance)
distance可以接受负数
将list元素整体向后移动distance的距离
原来最后的distance个元素放到最前面(类似与一个圆圈转动)
替换元素
Collections.replaceAll(List list, T oldVal, T newVal)
子集合索引
Collections.indexOfSubList(List source, List target)
Collections.lastIndexOfSubList(List source, List target)
如果不是子集合,返回-1
转换为不可变集合
Collections.unmodifiableCollection(Collection<? extends T> c)
将集合转换为不可变集合read-only
装饰者模式
使用final修饰iterator
增删元素的方法throw new UnsupportedOperationException()
Collections.unmodifiableSet(Set<? extends T> s)
Collections.unmodifiableList(List<? extends T> list)
Collections.unmodifiableMap(Map<? extends K, ? extends V> m)
转换为同步集合
Collections.synchronizedCollection(Collection c)
Collections.synchronizedCollection(Collection c, Object mutex) 指定mutex对象作为同步锁,将集合转换为线程安全的同步集合。装饰着模式,方法内使用了 synchronized (mutex) { ... }保证线程安全
Collections.synchronizedSet(Set s)
Collections.Collections.synchronizedSet(Set s, Object mutex)
Collections.synchronizedList(List list)
Collections.synchronizedList(List list, Object mutex)
Collections.synchronizedMap(Map<K, V>)
元素受限制集合
Collections.checkedCollection(Collection c, Class type)
由于JDK1.5引入了泛型,采用该方法,保证运行期集合中增加的元素只能是指定的类型。同样是装饰着模式。
Collections.checkedQueue(Queue queue, Class type)
Collections.checkedSet(Set, Class)
Collections.checkedList(List, Class)
Collections.checkedMap(Map<K, V>, Class, Class)
生成空的不可变集合
Collections.emptyIterator()
Collections.emptyListIterator()
Collections.emptyEnumeration()
Collections.emptySet()
Collections.emptyList()
Collections.emptyMap()
只有1个元素的不可变集合
Collections.singleton(T)
Collections.singletonList(T)
Collections.singletonMap(K, V)
拥有n个相同元素的不可变集合
Collections.nCopies(int, T)
反序比较器
Collections.reverseOrder(Comparator)
返回一个Comparator,返回值与参数值是相反顺序的比较器
转换为枚举类型的API
Collections.enumeration(Collection)
返回Enumeration
将Enumeration转换为集合
Collections.list(Enumeration)
返回ArrayList
元素在集合中的个数
Collections.frequency(Collection<?>, Object)
返回int
两个元素是否有交集
Collections.disjoint(Collection, Collection)
返回boolean
增加元素
addAll(Collection<? super T> c, T... elements)
由于List接口拥有listItegertor()方法
与List相关的大部分操作内部会判断阀值
超过阀值则采用listIterator遍历
小于阀值则采用for循环索引遍历
不同的方法阀值不同
Objects类
Objects.equals(Object a, Object b)
public static boolean equals(Object a, Object b) {
return a == b || (a != null && a.equals(b));
}
Guava工具类
集合接口 | 属于JDK还是*Guava* | 对应的Guava工具类 |
Collection | JDK | Collections2:不要和java.util.Collections混淆 |
List | JDK | Lists |
Set | JDK | Sets |
SortedSet | JDK | Sets |
Map | JDK | Maps |
SortedMap | JDK | Maps |
JDK | Queues | |
Guava | Multisets | |
Guava | Multimaps | |
Guava | Maps | |
Guava | Tables |
Apache提供的Collection
Apache提供的集合工具类功能也非常强大 还提供了集合的求交集、并集和差集等功能