List接口
1、List基本情况
- List 接口中的元素都是有序的,并且可以重复(有序指:存入元素的顺序与取出元素的顺序一致)
- List接口中的每个元素都有其对应的顺序索引
- API中List实现类有很多
2、List接口中的方法
- add(Object obj) 默认将其添加到最后一个位置
- add(int index,Object obj) :在 索引为index 的位置添加obj 元素
- addAll(int index, Collection c )在索引为index的位置添加集合C中的元素
- indexOf(Object obj) 返回obj 第一次出现的位置,没有则返回-1
- lastIndexOf(object obj) 返回obj 在集合中最后一次出现的位置
- remove(int index) 将下表为index的值删除
- remove(Object obj) :将集合中obj的值删除,如果该集合中含有多个时,一次只能删除一个
- set(int index,Object obj) 将索引为index的值该为obj;
- subList(int i,int j) 返回一个list的子集合 [0,2); 左闭右开 后面的取不到
3、List接口的实现列类
(1)、ArrayList集合
-
实现List集合
-
可以添加null值,并且可以添加多个null值
-
ArrayList集合底层是数组
-
ArrayList集合基本等同于Vector集合,除了ArrayList集合是线程不安全,而Vector集合是线程安全的,方法前面加了synchronized 关键字
-
ArrayList 集合底层实现
- ArrayList底层维护一个Object类型的数组elementDate
- 当创建ArrayList集合对象时,如果使用无参构造,则初始化elementDate的容量为0,第一次添加,将elementDate的容量为10,如果在扩容将容量扩容为原来的1.5倍
- 创建指定大小的构造器,初始化elementDate的容量为指定的大小,如果需要扩容,则直接扩容为原来大小的1.5倍
transient :表示瞬间,短暂的,表示该属性不会被序列化;
(2)、Vector集合
- Vector底层是一个对象数组
- Vector是线程安全的,方法上有synchronized;
- 在开发中,需要线程同步安全,考虑Vector集合,
- 安全,效率不高,因为做了线程安全处理
- 扩容:
- 无参,默认是10,满后,按两倍扩容
- 指定大小:每次直接按两倍扩容;
(3)、LinkedList集合
- LinkedList底层是一个双向链表
- 可以添加任意元素(元素可以重复,包括null值)
- 线程不安全,没有实现同步
- LinkedList维护了两个属性first 和last 分别指向首节点,和尾结点;
- 每个节点都是一个Node对象,,里面维护了pre,next,item 属性,其中通过pre指向前一个,next指向后一个,最终实现双向链表
- 因为linkedList底层是一个链表,所以不需要扩容
- LInkedList元素的添加和删除效率比较高,不是通过数组完成的
ArrayList、LinkedList 与Vector结合三者的比较
ArrayList | Vector | LinkedList | |
---|---|---|---|
底层结构 | 数组 | 数组 | 双向链表 |
增删效率 | 效率低 | 效率低 | 效率高 |
改查效率 | 效率高 | 效率高 | 效率低 |
线程安全 | 非线性安全 | 线程安全 | 非线程安全 |
扩容 | 默认是0,第一次添加扩容为10,再次扩容时,扩容为原来的1.5倍 | 链表实现,不考虑扩容 | 默认就是10,每次扩容时,扩容为原来得2倍 |