ArrayList是JDK提供的一个数组list,其实现基于java的数组, elementData是声明在该类里面的实际保存数组的变量:
private transient Object[] elementData;
删除:
remove的时候,需要遍历整个数组,找到匹配的元素, 然后调用内部私有方法,进行快速删除(fastRemove),这个删除方法不检查数组下标长度等。
public boolean remove(Object o) { if (o == null) { for (int index = 0; index < size; index++) if (elementData[index] == null) { fastRemove(index); return true; } } else { for (int index = 0; index < size; index++) if (o.equals(elementData[index])) { fastRemove(index); return true; } } return false; }
删除的方式是调用系统类的arraycopy方法对数组本身进行自复制,也可以说是自覆盖,从找到元素的后一个index开始复制(index+1),
private void fastRemove(int index) { modCount++; int numMoved = size - index - 1; if (numMoved > 0) System.arraycopy(elementData, index+1, elementData, index, numMoved); elementData[--size] = null; // Let gc do its work }
其实就是把该index后从index+1开始的数组全部覆盖到从index开始的位置,等于将整个数组左移了一位,所有移动的数量是numMoved。 然后再将数组最后一位清空。
填加:
public boolean add(E e) { ensureCapacity(size + 1); // Increments modCount!! elementData[size++] = e; return true; }
可以看到在填加元素时,首先检查是否需要对数组扩容,如果没问题,则将元素加入到目前数组的size++的位置,既加入到ArrayList的末尾。size是类级变量,java中int初始化给了默认值0。
检查容量的源码为:
public void ensureCapacity(int minCapacity) { modCount++; int oldCapacity = elementData.length; if (minCapacity > oldCapacity) { Object oldData[] = elementData; int newCapacity = (oldCapacity * 3)/2 + 1; if (newCapacity < minCapacity) newCapacity = minCapacity; // minCapacity is usually close to size, so this is a win: elementData = Arrays.copyOf(elementData, newCapacity); } }
比较时检查数组目前长度与传入的所需size,如果长度不够,则做扩容,扩容用目前长度的1.5倍来计算。 这里源码中还额外计算了最小容量与新容量的大小,使增加后的数组长度能到一个合理的大小。
新的数组数据用Arrays.copyOf方法进行克隆。 该方法还可以在程序员可以预估List大小时设定List的容量,减少其内部数组elementData的扩容次数。
List的特性与数组类似,内部实现也依赖于数组,并提供了更方便的方法,如增删时越界检查及自动扩容等,是JDK加强数组使用便利性的一种封装。
相关推荐
JDK8的ArrayList源码文件
这个"jdk1.8 sun源码"压缩包很可能包含了这些未公开的Sun Microsystems的源代码,使得开发者有机会深入研究Java平台的内部工作原理,这对于进行底层优化、理解和调试Java程序有着极大的帮助。然而,值得注意的是,...
Java Development Kit (JDK) 源码是学习和理解Java平台核心机制的关键资源。它包含了许多关键组件的源代码,使开发者能够深入探索Java语言的底层实现,从而提升编程技巧,优化性能,并理解标准库的工作原理。在这个...
7. **集合框架**:JDK 1.6的`java.util`包包含了各种集合实现,如ArrayList、LinkedList、HashMap等。源码分析可以揭示它们的内部结构和操作算法,这对于理解性能和选择合适的集合类型很有帮助。 8. **网络编程**:...
通过以上对ArrayList源码的分析,可以总结出如下关键知识点: 1. ArrayList的实现基于动态数组,可以动态地进行容量的调整; 2. ArrayList具有默认初始化容量10,以及无参构造时延迟初始化的特性; 3. ArrayList...
### ArrayList源码解析(JDK 1.8) #### 概述 `ArrayList`是Java集合框架中的一个核心组件,它提供了动态数组的功能。与固定大小的数组不同,`ArrayList`可以随着元素的增加而自动扩展其容量。在JDK 1.8中,`...
- **理解API底层实现**: 通过阅读源码,可以深入理解常用API的工作原理,如ArrayList如何动态扩容,HashMap如何实现快速查找等。 - **优化代码**: 了解系统内部开销,可以帮助编写更高效的代码,避免不必要的性能...
通过源码,我们可以学习这些类和接口的实现,例如ArrayList和HashMap的工作原理,线程同步的细节,以及Socket通信的底层实现。 4. **异常处理**: 源码中展示了Java如何处理异常,包括检查性异常和运行时异常。理解...
Java JDK实例宝典源码是Java开发者的重要参考资料,它涵盖了JDK中的各种核心类库、API及其实现的源代码。这些源码对于深入理解Java语言的底层运作机制、优化代码以及解决实际问题有着不可估量的价值。下面,我们将...
在JDK 1.6中,你可以在这里找到如Object、String、ArrayList、HashMap等基础类的源代码,这些是构建任何Java程序的基础。 **6. org 文件夹** org目录通常包含开源组织或标准组织提供的库。在JDK 1.6中,org可能包含...
源码分析是深入理解Java平台工作原理的关键,对于开发者来说,能够查看和学习JDK的源代码是提升技能的重要途径。在这个压缩包中,包含了一些主要的Java核心库的源代码,如`com`, `org`, `launcher`, `java`, 和 `...
在JDK 1.6中,ArrayList提供了线程不安全的高效操作,适合于非并发环境下的高性能读写操作。其优点在于随机访问快速,因为数组支持索引直接访问;缺点是插入和删除元素需要移动后续元素,效率较低。 Vector与...
**JDK1.7源码包详解** JDK(Java Development Kit)是Oracle公司发布的Java编程语言的开发工具包,它是Java开发环境的基础。JDK1.7,也被称为Java SE 7(Java Standard Edition 7),是Java发展历程中的一个重要...
JDK 1.8的源码中包含了很多关键的Java类库,如基础集合框架(如ArrayList, HashMap)、并发工具类、IO流、网络编程API以及重要的语言新特性。以下是JDK 1.8中的一些重要知识点: 1. **Lambda表达式**:这是JDK 1.8...
源码分析能够揭示ArrayList、HashMap、HashSet等数据结构的内部实现,帮助理解其性能特点和适用场景。 8. **网络编程** JDK 1.6的Socket和ServerSocket类提供了基础的网络通信功能。通过源码,我们可以学习到连接...
### jdk源码阅读一:ArrayList #### 一、ArrayList简介与特性 ArrayList作为Java集合框架中的重要组成部分,被广泛应用于各种应用场景。它的主要特点包括: - **基于数组实现**:ArrayList采用数组作为其底层数据...
在探讨 JDK 7.0 中 ArrayList 的底层实现原理之前,首先需要了解 ArrayList 作为 Java 集合框架中 List 接口的动态数组实现类的基本概念。ArrayList 提供了一种存储有序、可重复、允许为 null 的数据结构,并且该...
- JDK1.8中对集合框架进行了重大更新,`ArrayList`、`LinkedList`、`HashSet`、`HashMap`等都有对应的源码,可以深入理解它们的工作原理和性能差异。 - **Stream API**:新引入的流API提供了函数式编程的支持,...