List 接口实现了 Collection 接口,它主要有两个实现类:ArrayList 类和 LinkedList 类。在 List 集合中允许出现重复元素。与 Set 集合不同的是,在 List 集合中的元素是有序的,可以根据索引位置来检索 List 集合中的元素,第一个添加到 List 集合中的元素的索引为 0,第二个为 1,依此类推。
ArrayList 类
ArrayList 类提供了快速的基于索引的成员访问方式,对尾部成员的增加和删除支持较好。使用 ArrayList 创建的集合,允许对集合中的元素进行快速的随机访问,不过,向 ArrayList 中插入与删除元素的速度相对较慢。该类的常用构造方法有如下两种重载形式。
- ArrayList():构造一个初始容量为 10 的空列表。
- ArrayList(Collection<?extends E>c):构造一个包含指定 Collection 的元素的列表,这些元素是按照该 Collection 的迭代器返回它们的顺序排列的。
List接口的特点:
1. 有序【存储有序】
2. 可重复
3. 可以存储 `null`值
4. 部分子集合线程安全,部分不安全 例如 `ArrayList` 和 `Vector`
5. 有索引,针对每个元素能够方便地查询和修改
6. 判断元素是否重复依赖于`equals`方法
a. 如果元素是系统类,不需要重写`equals`方法
b. 如果是自定义类,就需要我们按需求重写 `equals`方法
java.util.ArrayList < E > 的一些方法 描述
- ArrayList() 构造函数,创建一个空的列表, size为0
- add(o: E): void 在list的末尾添加一个元素o
- add(index: int, o: E): void 在指定的index处插入元素o
- clear(): void 从list中删除所有元素
- contains(o: Object): boolean 如果list含有元素o,返回true
- get(index: int): E 返回指定index处的元素
- indexOf(o: Object): int 返回list中第一个匹配元素的index
- isEmpty(): boolean 如果list不含元素,返回true
- lastIndexOf(o: Object): int 返回list中最后一个匹配元素的index
- remove(o: Object): boolean 删除list中的第一个元素o,如果元素被删除,返回true
- size(): int 返回list中元素个数
- remove(index: int): boolean 删除指定index处的元素,如果元素被删除,返回true
- set(index: int, o: E): E 设置指定index处的元素为o
注意: 使用 subList() 方法截取 List 集合中部分元素时要注意,新的集合中包含起始索引位置的元素,但是不包含结束索引位置的元素。例如,subList(1,4) 方法实际截取的是索引 1 到索引 3 的元素,并组成新的 List 集合。
List接口去除重复元素:**
方式一:创建一个新的集合去除重复元素再使用地址传递
方式二:在原集合的基础上使用选择排序思想去除重复元素
1 List<String> list = new ArrayList<String>();
2 list.add("张三");
3 list.add("李四");
4 list.add("李四");
5 list.add("李四");
6 list.add("王五");
7
8 for (int i = 0; i < list.size(); i++) {
9 for (int j = i + 1; j < list.size(); j++) {
10 if (list.get(i).equals(list.get(j))) {
11 list.remove(j);
12 j--;
13 }
14 }
15 }
并发修改异常的处理:
异常名称:并发修改异常 java.util.ConcurrentModificationException
产生原因:在使用迭代器迭代的同时使用原集合对元素做了修改
解决办法:
1. 使用 toArray 方法
2. 使用 普通 for 遍历
3. 使用 ListIterator 遍历集合并且使用 列表迭代器修改元素
LinkList类
LinkedList 类采用链表结构保存对象,这种结构的优点是便于向集合中插入或者删除元素。需要频繁向集合中插入和删除元素时,使用 LinkedList 类比 ArrayList 类效果高,但是 LinkedList 类随机访问元素的速度则相对较慢。这里的随机访问是指检索集合中特定索引位置的元素。
LinkedList 是一个继承于AbstractSequentialList的双向链表。它也可以被当作堆栈、队列或双端队列进行操作。
LinkedList 实现 List 接口,能对它进行队列操作。
LinkedList 实现 Deque 接口,即能将LinkedList当作双端队列使用。
LinkedList 实现了Cloneable接口,即覆盖了函数clone(),能克隆。
LinkedList 实现java.io.Serializable接口,这意味着LinkedList支持序列化,能通过序列化去传输。
LinkedList 是非同步的。
LinkedList 类除了包含 Connection 接口和 List 接口中的所有方法之外,还实现了下列方法。
void addFirst(E e) | 将指定元素添加到此集合的开头 |
void addLast(E e) | 将指定元素添加到此集合的末尾 |
E getFirst() | 返回此集合的第一个元素 |
E getLast() | 返回此集合的最后一个元素 |
E removeFirst() | 删除此集合中的第一个元素 |
E removeLast() | 删除此集合中的最后一个元素 |
这篇博文讲的特别好,需要详细了解可参考 https://www.cnblogs.com/lintong/p/4374292.html