专栏名称: 程序员大咖
为程序员提供最优质的博文、最精彩的讨论、最实用的开发资源;提供最新最全的编程学习资料:PHP、Objective-C、Java、Swift、C/C++函数库、.NET Framework类库、J2SE API等等。并不定期奉送各种福利。
目录
相关文章推荐
51好读  ›  专栏  ›  程序员大咖

Java ArrayList 工作原理及实现

程序员大咖  · 公众号  · 程序员  · 2018-05-21 10:24

正文

请到「今天看啥」查看全文



按数组下标访问元素—get(i)/set(i,e) 的性能很高,这是数组的基本优势。


直接在数组末尾加入元素—add(e)的性能也高,但如果按下标插入、删除元素—add(i,e), remove(i), remove(e),则要用System.arraycopy()来移动部分受影响的元素,性能就变差了,这是基本劣势。


然后再来学习一下官方文档:


Resizable-array implementation of the List interface. Implements all optional list operations, and permits all elements, including null. In addition to implementing the List interface, this class provides methods to manipulate the size of the array that is used internally to store the list. (This class is roughly equivalent to Vector, except that it is unsynchronized.)


ArrayList是一个相对来说比较简单的数据结构,最重要的一点就是它的自动扩容,可以认为就是我们常说的“动态数组”。

来看一段简单的代码:


ArrayList list = new ArrayList ();

list.add("语文: 99");

list.add("数学: 98");

list.add("英语: 100");

list.remove(0);


在执行这四条语句时,是这么变化的:




其中,add操作可以理解为直接将数组的内容置位,remove操作可以理解为删除index为0的节点,并将后面元素移到0处。


2. add函数


当我们在ArrayList中增加元素的时候,会使用add函数。他会将元素放到末尾。具体实现如下:


public boolean add(E e) {

ensureCapacityInternal(size + 1);  // Increments modCount!!

elementData[size++] = e;

return true;

}


我们可以看到他的实现其实最核心的内容就是ensureCapacityInternal。这个函数其实就是自动扩容机制的核心。我们依次来看一下他的具体实现


private void ensureCapacityInternal(int minCapacity) {

if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {







请到「今天看啥」查看全文