再次回顾一下之前的Collection的继承体系
- Collection
- List
- ArrayList
- Vector
- LinkedList
- set
- HashSet
- TheeSet
- List
现在我们来看List相关的内容
1、List是Collection的子接口
特点:有序(存储顺序和取出顺序一致),可重复
2、List的特有功能
a、添加功能
void add(int index, Object element):在指定位置添加元素
b、获取功能
Object get(int index):获取指定位置的元素
c、列表迭代器
ListIterator ListIterator():List集合特有的迭代器
d、Object remove(int index):根据索引删除元素,返回被删除的元素
e、Object set(int index,Object element):根据索引修改元素,返回被修饰的元素
3、List集合的特有遍历功能
1、size和get结合
2、for循环遍历
一般我们用增强for循环较多,这个就不在这里赘述了,提到一下就好
4、List有列表迭代器这样一个特色的功能,大家可以了解一下,可以实现逆向遍历,但是必须要先正向遍历
所以一般没什么意义,一般不用
5、并发修改异常
a、出现的现象:
迭代器遍历集合,集合修改集合元素
b、原因
迭代器是依赖于集合的,而集合的改变迭代器并不知道
c、解决方案:
1、迭代器遍历,迭代器更改(ListIterator)
元素添加在刚刚迭代的位置
2、集合遍历,集合修改size和get
元素添加在集合的末尾
List的子类:
1、List的子类
1.List子类特点:
ArrayList
底层数据结构是数组,查询快,增删慢
线程不安全,效率高
Vector
底层数据结构是数组,查询快,增删慢
线程安全,效率低
LinkedList
底层数据结构是链表,查询慢,增删快
线程不安全,效率高
2.ArrayList
没有特有功能要学习
案例:
1、ArrayList存储字符串并遍历
2、ArrayList存储自定义字符串并遍历
3.Vector
特有功能:
添加
public void addElement(E obj)-----add()
获取
public E elementAt(int index)------get()
public Enumeration<E> elements()---iterator()
4.LinkedList
特有功能:
添加
addFirst()
addLast()
删除
removeFirst()
removeLast()
获取
getFirst()
getLast()
案例:
a、LinkedList存储字符串并遍历
b、LinkedList存储自定义对象并遍历
5.案例:
A、去除集合中的多个字符串的重复元素
如果字符串的内容相同,即为重复元素
B、去除集合中的多个自定义对象的重复元素
如果自定义对象的成员变量值都相同,即为重复元素
C、用LinkedList模拟一个栈数据结构的集合类,并测试
在JDK5之后出现了增强for循环
增强for:是for循环的一种
格式:
for(元素数据类型 变量: 数组或者Collection集合){
使用变量即可,该变量就是元素
}
好处:简化了数组和集合的遍历
弊端:增强for的目标不能为null
如何解决呢?
对增强for的目标先判断不为空,再使用增强for
增强for其实是用来替代迭代器的
下面作为一个补充,List之前考到过的面试题
List的面试题
List的子类特点
ArrayList:
底层数据结构是数组,查询快,增删慢
线程不安全,效率高
Vector:
底层数据结构是数组,查询快,增删慢
线程安全,效率低
LinkedList:
List接口的链表实现(双重链表)
底层数据结构是链表,查询慢,增删快
线程不安全,效率高
List有三个子类,使用哪一个呢?
看情况,看需求。
要安全:Vector 即使要安全也不用,后面有替代的
不要安全:ArrayList或者LinkedList
查询多:ArrayList
增删多:LinkedList