一、集合框架的由来
Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射。Collection 接口又有 3 种子类型,List、Set和Queue,再下面是一些抽象类,最后是具体实现类,常用的有ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、LinkedHashMap 等等。
集合框架是一个用来代表和操纵集合的统一架构。所有的集合框架都包含如下内容:
接口:是代表集合的抽象数据类型。例如 Collection、List、Set、Map 等。之所以定义多个接口,是为了以不同的方式操作集合对象
实现(类):是集合接口的具体实现。从本质上讲,它们是可重复使用的数据结构,例如:ArrayList、LinkedList、HashSet、HashMap。
算法:是实现集合接口的对象里的方法执行的一些有用的计算,例如:搜索和排序。这些算法被称为多态,那是因为相同的方法可以在相似的接口上有着不同的实现。
除了集合,该框架也定义了几个 Map 接口和类。Map 里存储的是键/值对。尽管Map不是集合,但是它们完全整合在集合中。
二、数组与集合的区别
数组的特点:
- 只能存储同一种数据类型的数据。
- 一旦初始化,长度固定。
- 数组中的元素与元素之间的内存地址是连续的。
注意: Object类型的数组可以存储任意类型的数据。
集合:集合是存储对象数据的集合容器。
集合比数组的优势:
- 集合可以存储任意类型的对象数据,数组只能存储同一种数据类型 的数据。
- 集合的长度是会发生变化的,数组的长度是固定的
三、collection之继承体系
Collection
集合框架概述
1 | Collection |
四、Collection泛型接口
1 | boolean add(E e) |
collection方法简单示例:
1 | //集合转数组遍历 |
五、List泛型接口
1 | public interface List<E>extends Collection<E> //超级接口 |
方法概述:
1 | boolean add(E o) |
list方法简单示例:
1 | public static void demo2() { |
并发修改异常产生的原因及解决方案
假设有一个集合,请问,我想判断里面有没有”world”这个元素,如果有,我就添加一个”java”元素,具体代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 public static void demo3() {
List list = new ArrayList();
list.add("a");
list.add("b");
list.add("world");
list.add("d");
list.add("e");
Iterator it = list.iterator();
while(it.hasNext()) {
String str = (String)it.next();
if(str.equals("world")) {
list.add("javaee"); //这里会抛出ConcurrentModificationException并发修改异常
}
}
}
运行上面代码发生ConcurrentModificationException并发修改异常,查看迭代器源代码如下。
产生原因:迭代器是依赖于集合而存在的,在判断成功后,集合的中新添加了元素,而迭代器却不知道,迭代器的内容不发生改变。所以就报错了,这个错叫并发修改异常。1
2
3
4
5 final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
}
解决办法及代码如下:
迭代器迭代元素,迭代器修改元素(ListIterator的特有功能add)
集合遍历元素,集合修改元素
1
2
3
4
5
6
7
8
9
10 public static void demo() {
ListIterator lit = list.listIterator(); //如果想在遍历的过程中添加元素,可以用ListIterator中的add方法
while(lit.hasNext()) {
String str = (String)lit.next();
if(str.equals("world")) {
lit.add("javaee");
//list.add("javaee");
}
}
}了解:(ListIterator)
- boolean hasNext()是否有下一个
- boolean hasPrevious()是否有前一个
- Object next()返回下一个元素
- Object previous();返回上一个元素
六、ArrayList类
方法摘要:
1 | public class ArrayList<E>extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, Serializable |
构造方法摘要
1 | ArrayList() |
ArrayList示例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 public static void demo1() {
ArrayList arr = new ArrayList();
arr.add(new Student("张三", 23));
arr.add(new Student("李四",24));
System.out.println(arr);
Iterator it = arr.iterator();
while (it.hasNext()) {
Student student = (Student) it.next();
System.out.println(student.getName()+"..."+student.getAge());
}
}
public static void demo() {
ArrayList arr = new ArrayList();
arr.add("a");
arr.add("b");
arr.add("c");
arr.add("d");
System.out.println(arr);
}
}
七、LinkedList类
1 | public class LinkedList<E>extends AbstractSequentialList<E>implements List<E>, Queue<E>, Cloneable, Serializable |
构造方法摘要
1 | LinkedList() |
方法摘要
1 | boolean add(E o) |
八、vector
1 | public class Vector<E>extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, Serializable |
构造方法摘要
1 | Vector() |
特有方法摘要
1 | boolean add(E o) |