ArrayList

Posted jin1000x

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ArrayList相关的知识,希望对你有一定的参考价值。

1、ArrayList类继承和实现结构:

技术图片

2、ArrayList底层是数组实现,默认数组大小为10。当数组大小不够时会进行扩容。所以也就说ArrayList底层是由动态数组实现,因为数组长度可变。每次扩容长度为:(原数组长度*3)/2+1。(即是1.5倍,JDK1.8使用方式是:原数据长度>>1)

3、因为ArrayList底层是由数组实现的,加上实现了RandomAccess接口,所以适合随机访问查找,即get的时候非常快。另外顺序添加数据也非常方便。

4、也因为ArrayList底层是由数组实现的,当需要扩容或插入数据或删除数据时,都会涉及一次数组复制,如果要复制的元素非常多,那么会比较耗费性能。

5、ArrayList与Vector的区别:
a.ArrayList是非线性安全的,Vector是线性安全的(Vector类的大多数方法都有synchronizedList关键字修饰)。
b.Vector初始化数组长度为10,这跟ArrayList一样。但Vector可以自定义增长因子(扩容),通过构造方法,默认扩容为原数组的2倍,即自增一倍。

6、为什么ArrayList的elementData是用transient修饰的?
ArrayList实现了Serializable接口,这意味着ArrayList是可以被序列化的,用transient修饰elementData意味着不希望elementData数组被序列化。这是为什么?因为序列化ArrayList的时候,ArrayList里面的elementData未必是满的,比方说elementData有10的大小,但是只用了其中的3个,那么是否有必要序列化整个elementData呢?显然没有这个必要,因此ArrayList中重写了writeObject方法和readObject方法。

以上是关于ArrayList的主要内容,如果未能解决你的问题,请参考以下文章

泛型集合

Linkedlist

Vector

hashSet

TreeSet

笔记--集合