ArrayList源码分析

ArrayList源码分析

  • JDK7 和JDK8 中有所不同
JDK7
  • new ArrayList()底层创建了长度为10的Object[]数组elementData
  • 当此次添加导致底层elementData数组容量不够(10),则扩容,每次扩容1.5倍,同时调用(Arrays.copyOF()方法)将原有数组种的数据复制到新的数组中
int newCapacity = oldCapacity + (oldCapacity >> 1);
  • 建议开发中使用带参的构造器new ArrayList(init);,避免超出初始容量时进行扩容,提高效率
JDK8
  • JDK8的时候,直接使用了静态空数组,并没有创建长度为10的数组
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

  • 当调用add的时候如果数组长度小于10并且没有初始化数组长度,则会比较数组小于10的话,会创建长度为10的数组
  • 后续的添加操作和扩容与jdk7无异
private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        // minCapacity is usually close to size, so this is a win:
        elementData = Arrays.copyOf(elementData, newCapacity);
    }
小结
  • jdk7中的ArrayList的对象的创建类似于单例的饿汉式,而jdk8中的ArrayList对象的创建类似于单例的懒汉式,延迟了数组的创建,节省了内存。
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容