(1)Array类是final的,都是static或native方法,提供了动态创建和访问 Java 数组的方法,数组通过Array类的newInstance(Class<T> c, int length)实例化。
(2)Arrays可以看做一种工具类,都是static方法,sort(), binarySearch(), toString(), copyOf()等,copyOf()调用了System.arrayCopy()。
有asList(T... a)方法返回一个固定大小的List,是Arrays的一个内部类,也叫ArrayList
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
内部类ArrayList只能get(),set(),不能add(),remove(),大小固定
private static class ArrayList<E> extends AbstractList<E>
implements RandomAccess, java.io.Serializable
(3)Collections
有内部类SynchronizedCollection,里面有Object mutex用于加锁
Collections.synchronizedList(List<T> list)返回的是内部类SynchronizedList<E> extends SynchronizedCollection<E> implements List<E>,用了静态代理模式,例如
public void add(int index, E element) {
synchronized (mutex) {list.add(index, element);}
}
Collections.unmodifiableMap返回只读的Map,返回的是Collections的一个内部类UnmodifiableMap<K,V> implements Map<K,V>, Serializable,只支持isEmpty(),containsKey(),get()等方法,调用put(),remove(),clear()等方法时直接抛UnsupportedOperationException
(4)Arrays.sort()和Collections.sort()的区别
Arrays.sort()对基本类型(引用类型也是用Timsort)使用双轴快速排序(DualPivotQuicksort类),小数组用插入排序,大数组根据两个pivot分成三部分,将每个数放入对应部分,递归。这样公式是T(n) = 3T(n/3) + (5/3)n(因为有1/3的概率比较一次,2/3比较两次,所以是5/3n),算出来略大于nlogn,DualPivotQuicksort内部肯定做了一些优化,源码待看。
Collections.sort()使用Timsort类,优化了归并排序,会找到数据中已经排好序的部分(包括正序和反序),再合并,如果数组小,使用二分插入排序。
数组(基本类型)用快排,集合(引用类型)用归并,因为数组在内存中连续,有利于快排时进行扫描,集合在内存中离散,快排优势不大,而且如果是链表的归并也不需要额外的空间