# Java源码分析之ArrayList **Repository Path**: fpfgitmy_admin/java-source-code-arraylist ## Basic Information - **Project Name**: Java源码分析之ArrayList - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2021-04-28 - **Last Updated**: 2021-04-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README #### 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对象的创建类似于单例的懒汉式,延迟了数组的创建,节省了内存。