美文网首页
ArrayList源码分析

ArrayList源码分析

作者: felixfeijs | 来源:发表于2021-04-02 18:52 被阅读0次

    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对象的创建类似于单例的懒汉式,延迟了数组的创建,节省了内存。

    相关文章

      网友评论

          本文标题:ArrayList源码分析

          本文链接:https://www.haomeiwen.com/subject/mzuqkltx.html