码迷,mamicode.com
首页 > 编程语言 > 详细

JAVA集合类之ArrayList源码分析

时间:2016-07-20 19:51:00      阅读:198      评论:0      收藏:0      [点我收藏+]

标签:java 集合类 arraylist

 ArrayList继承自AbstractList抽象类,实现了List接口。

 public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable

ArrayList类中存储数据用的是Object类型的数组

private transient Object[] elementData;

此处的elementData使用了transient关键字进行了修饰。被transient关键字修饰的变量在对象序列化时是不操作的。那ArrayList对象在序列化时,elementData数组是否真的就不处理呢?我们来看writeObject函数:

s.defaultWriteObject();
// Write out array length
s.writeInt(elementData.length);
// Write out all elements in the proper order.
for (int i=0; i<size; i++)
            s.writeObject(elementData[i]);

其实elementData是人为的进行序列化了。

 

实例化ArrayList对象时,默认数组的大小为10.

public ArrayList() {
 this(10);
}

ArrayList元素数组在扩大时,扩大的算法是:(目前大小)*3/2+1

int newCapacity = (oldCapacity * 3)/2 + 1;

 

add(E e) 函数:

ensureCapacity(size + 1);  // Increments modCount!!
elementData[size++] = e;

 先扩容数组,然后在数组尾部追加新元素。

 

add(int index, E element)函数:

ensureCapacity(size+1);  // Increments modCount!!
System.arraycopy(elementData, index, elementData, index + 1,
    size - index);
elementData[index] = element;
 size++;

同样也是先扩容数组,接着调用System.arraycopy将数组元素进行调整,然后在指定位置index处,插入新元素。

 

由此可以得出,向ArrayList中添加元素时,尽量使用add函数,这样效率高。

 

读取元素直接根据下标从elementData中获取

RangeCheck(index);
return (E) elementData[index];

 

总结:

ArrayList一个基于数组的线性表,同时它不是线程安全的。读取元素效率高,写入元素效率偏低。

因此ArrayList不适用于频繁做插入和删除操作。

本文出自 “怒放的生命” 博客,请务必保留此出处http://shane.blog.51cto.com/824878/1828091

JAVA集合类之ArrayList源码分析

标签:java 集合类 arraylist

原文地址:http://shane.blog.51cto.com/824878/1828091

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!