首先我们来认识一下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的对象的创建类似于单例的懒汉式,延迟了数组的创建,节省内存。