相同点:三者都实现了List接口,存储数据的特点相同:存储的都是有序的,可重复的
不同点:
ArrayList:
1、 作为List的接口的主要实现类。
2、线程不安全的,效率高;
3、底层使用Object[] elementDate存储(与vector底层相同)
底层分析:ArrayList对于jdk7和jdk8底层是不一样的。
jdk7:
ArrayList list = new ArrayList();//底层创建了长度是10的Object[] elementDate数组
list.add(123);//elementDate[0] = new Integer(123);
.......
list.add(11);//如果此次添加导致底层elementDate数组容量不够,则扩容
默认情况下,扩容为原来容量的1.5倍,同时需要将原有数组中的数据复制到新的数组中。
jdk8:
ArrayList list = new ArrayList();//底层Object[] elementDate初始化为{},并没有创建长度为10的数组
list.add(123);//第一次调用add()时,底层才能创建长度10的数组,并将数据123添加到elementDate[]数组中
后续额添加和扩容与jdk7无异。
LinkedList:
1、对于频繁的插入、删除操作。
2、使用此类比ArrayList效率高。
3、底层使用双向链表存储。
底层分析:
LinkList link = new LinkList();//内部声明了Node类型的first和last属性。默认值为null
list.add(123);//将123封装到Node中,创建了Node对象
Vector:
1、作为List接口的古老实现类。
2、线程安全的,效率低;
3、底层使用Object[] elementDate存储
底层分析:
jdk7和jdk8中通过vector()构造器创建对象时,底层都创建了长度为10的数组。在扩容方面,默认扩容为原来的数组长度的2倍。