#Collection子接口之一:List接口
List接口概述
-
鉴于Java中数组用来存储数据的局限性,我们通常使用List替代数组
-
List集合类中元素有序、且可重复,集合中的每个元素都有其对应的顺序索引。
-
List容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素。
-
JDK API中List接口的实现类常用的有:ArrayList、LinkedList和Vector。
-
ArrayList、LinkedList和Vector三种异同
-
相同点
三个类都实现了List接口,存储数据的特点相同:有序的,可重复的数据
-
不同点
- ArrayList
- 线程不安全,效率高
- 底层使用Object[] elementData存储
- Vector
- 线程安全,效率高
- 底层使用Object[] elementData存储
- LinkedList
- 线程不安全,效率高
- 底层使用双向链表存储
- 对于频繁的插入,删除操作效率比ArrayList高
- ArrayList
-
##List实现类之一:ArrayList底层实现
-
JDK1.7
- 底层使用数组实现,底层创建了一个长度为10的Object[]类型的数组 elementData
- list.add(111):elementData[0]=new Integer(123)
- 当添加的元素导致elementData[]数组的容量不够了之后,则扩容,默认情况下,扩容为原来的容量的1.5倍,同时需要将原来数组中的元素拷贝到扩容后的数组中
-
JDK1.8
- 实例化List对象的时候,底层创建了一个Object[]类型的数组 elementData{},没有设置长度
- 第一次添加元素的时候,底层才会创建一个长度为10的数组,并将元素添加到elementData{}中
- 扩容方式和JKD1.7相同
-
JDK1.7中ArrayList对象的创建类似单例的饿汉模式,而JKD1.8中ArrayList对象的创建类似单例的懒汉模式
-
List实现类之二:LinkedList底层实现
- 底层通过双向链表实现
-
**List **实现类之三:Vector底层实现
- 底层和ArrayList差不多,只是扩容的时候是原来的两倍
-
ArrayList中remove()方法的案例
代码如下:
@Test public void testListRemove() { List list = new ArrayList(); list.add(1); list.add(2); list.add(3); updateList(list); System.out.println(list);// } private static void updateList(List list) { list.remove(2); } //结果是删除元素3