java.lang.reflect.Array,java.util.Arrays与java.util.Collections

本文详细介绍了Java中Array、Arrays、Collections类的功能与用法,对比了Arrays.sort()与Collections.sort()的不同之处,以及它们背后的排序算法实现原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(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类,优化了归并排序,会找到数据中已经排好序的部分(包括正序和反序),再合并,如果数组小,使用二分插入排序。

    数组(基本类型)用快排,集合(引用类型)用归并因为数组在内存中连续,有利于快排时进行扫描,集合在内存中离散,快排优势不大,而且如果是链表的归并也不需要额外的空间

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值