ArrayList的源码分析(持续更新)

	首先我们来认识一下ArrayList,LinkedList,Vector的相同点和不同点分别是什么:

相同点:三个类都是实现了List接口,存储数据的特点相同:存储有序的、可重复的数据。

不同点:
ArrayList:作为List接口的主要实现类:线程不安全,效率高,底层使用Object[] elementData存储。
LinkedList:对于频繁的插入、删除操作,使用此类效率比ArrayList高:底层使用双向链表存储。
Vector:作为List接口的古老实现类:线程安全的,效率低;底层使用Object[] elementData存储。

ArrayList的源码分析:jdk7下情况:
ArrayList List =new ArrayList();
//底层创建了长度是10的object[]数组elementData
list.add(123);//elemrntData[0] =new Interger(123);

list.add(11);
//如果此次的添加导致底层elementData数组容量不够,则扩容。默认情况下,扩容为原来容量的1.5倍,同时将原有数组的数据中复制到新的数组中。

结论:建议开发中使用带参的构造器:ArrayList list =new ArrayList(int capacity)
jdk8 中ArrayList的变化:
ArrayList list=new ArrayList();//底层object[] elementData初始化{},并没有创建长度为10的数组。
list.add(123);//第一次调用add()时,底层才创建了长度10的数组,并将数据123添加到elementData

后续的添加和扩容与jdk7无异。

小结:jdk7中的创建类似于单例的饿汉式,而jdk8中的ArrayList的对象的创建类似于单例的懒汉式,延迟了数组的创建,节省内存。

猜你喜欢

转载自blog.csdn.net/RacardoMlu/article/details/107618796