List接口 是 Collection接口 的子接口。
Collection接口 是单例集合,用来存储一个个的对象。
List接口 在此之上,是用来存储 有序,不可重复的 数据。
而List接口又有三个实现类,ArrayList、LinkedList、Vector。

Vector        JDK 1.0 就有
ArrayList    JDK 1.2 增加
LinkedList  JDK 1.2 增加

 

  • ArrayList    是List接口主要的实现类,效率高,但线程不安全
  • Vector     是List接口古老的实现类,线程安全,但效率低
  • LinkedList    底层使用双向链表存储。适用于频繁的插入、删除操作。(ArrayList、Vector 底层都是使用Object[ ] elementData 存                             储,也就是使用 数组 存储)


    ArrayList jdk 8  与 jdk 7 的改变:
    我们用如下一段代码 创建一个 ArrayList()集合,并添加一个数据。
    ArrayList list = new ArrayList();
    list.add("Test");
    jdk 7 中, 当我们 执行 ArrayList list = new ArrayList(); 的时候,底层就会给我们创建好一个长度为10的 Object[ ] 类型的数组。
    可以看源码:

 

 

而 jdk 8 中 ,当我们 执行 ArrayList list = new ArrayList(); 的时候,底层并不会会给我们创建好一个长度为10的 Object[ ] 类型的数组。
而是在我们执行 add() 方法(例如:list.add("Test"); )  的时候,底层才会给我们创建数据。
同样,我们来看下源码:

而在我们调用add()方法的时候:

 

现在我们知道了,相较于jdk7 , 在jdk 8 中一开始并没有创建数组,而是在add之后,再创建。
这样设计的好处在于,可以节省内存
因为,我们创建ArrayList 集合之后  到 我们向这个集合中 添加数据 的这一段时间,就算给这个集合分配了内存,也是空着的。会造成内存的浪费。当大量、频繁 创建ArrayList的时候,会节省出很多内存。

 

补充:Vector 相较于 ArrayList,扩充时,ArrayList是扩充1.5倍,而Vector是扩充2倍。 


List接口继承了Collection集合的方法
并且还新增了一些方法

下面列举一些常用的操作集合元素的方法:

void add(int index, Object ele):在index位置插入ele元素
boolean addAll(int index, Collection eles):从index位置开始将eles中的所有元素添加进来
Object get(int index):获取指定index位置的元素
int indexOf(Object obj):返回obj在集合中首次出现的位置
int lastIndexOf(Object obj):返回obj在当前集合中末次出现的位置
Object remove(int index):移除指定index位置的元素,并返回此元素
Object set(int index, Object ele):设置指定index位置的元素为ele
List subList(int fromIndex, int toIndex):返回从fromIndex到toIndex位置的子集合

 总结分类一下常用的方法:
:add(Object obj)
:remove(int index) / remove(Object obj)
:set(int index, Object ele)
:get(int index)
:add(int index, Object ele)
长度:size()
遍历:① Iterator迭代器方式
           ② 增强for循环
            ③ 普通的循环