《疯狂 Java讲义(第二版)》
第1章 Java语言概述
1.1 Java语言的发展简史
第8章 Java集合体系
8.1 简述
Java 集合,就是一个容器,我们可以把多个对象丢到该容器中。在Java 5之前,集合会丢弃容器中对象的数据类型,所有对象就会当成Object类型进行处理。在Java 5增加泛型后,集合就记住了对象的数据类型,从而可以编写出更加简洁、健壮的代码。
Java集合 = Set + List + Map + Queue(Java 5增加)
集合 | 特点 |
---|---|
Set | 无序、不可重复 |
List | 有序、可以重复 |
Map | 映射关系 |
Queue | 队列 |
集合和数组的区别
- 数组长度不变;集合长度可变
- 数组无法保存映射关系;集合可以保存映射关系(Map)
- 数组元素既可以是基本数据类型,也可以是对象;集合元素只可以是对象
8.2 Collection 和 Iterator
8.2.1 Collection
Collection接口是Set、List和Queue的统一父接口,定义了统一的集合操作方法。
方法 | 功能描述 |
---|---|
boolean add(Object o) | 向集合里添加一个元素。如果集合对象被添加操作改变了,则返回true |
boolean addAll(Collection c) | 把集合c里的所有元素添加到指定集合里。如果集合对象被添加操作改变了,则返回true |
void clear() | 清除集合里的所有元素,将集合长度变为0 |
boolean contains(Object o) | 判断集合里是否包含指定元素 |
boolean containsAll(Collection c) | 判断集合里是否包含集合c里的所有元素 |
boolean isEmpty() | 返回集合是否为空。当集合长度为0时返回true,否则返回false |
Iterator iterator() | 返回一个Iterator对象,用于遍历集合里的元素 |
boolean remove(Object o) | 删除集合中的指定元素o,当集合中包含了一个或多个元素o时,这些元素将被删除,该方法将返回true |
boolean removeAll(Collection c) | 从集合中删除集合c里包含的所有元素(相当于用调用该方法的集合减集合c) |
boolean retainAll(Collection c) | 从集合中删除集合c里不包含的元素(相当于把调用该方法的集合变成该集合和集合c的交集) |
int size() | 返回集合里元素的个数 |
Object[] toArray() | 把集合转换成一个数组,所有的集合元素变成对应的数组元素 |
注意
当输出一个集合时,会输出集合中具体的元素,这是因为所有Collection的实现类都重写了toString()方法
8.2.2 Iterator
Iterator接口虽然是Java集合体系中的成员,但是它不是用来盛装集合元素的,而是用来**遍历(迭代访问)**集合元素的。
方法 | 功能描述 |
---|---|
boolean hasNext() | 如果被迭代的集合元素还没有被遍历,则返回true |
Object next() | 返回集合里的下一个元素 |
void remove() | 删除集合里上一次next方法返回的元素。 |
注意
当使用Iterator对集合元素进行迭代时,Iterator并不是把集合元素本身传给了迭代变量,而是把集合元素的值传给了迭代变量,所以修改迭代变量的值对集合元素本身没有任何影响。
这里的描述其实不准确。Iterator在对集合进行迭代时,其实是把元素的地址传给了迭代变量。如果你的修改是修改了迭代变量的指向地址(比如List<String>),这对元素本身是没有影响的;如果你的修改是迭代变量指向地址的内容,那就对集合是有影响的。
重点理解:堆栈的关系
当使用Iterator迭代访问Collection集合元素时,Collection集合里的元素不能被改变,只有通过Iterator的remove方法删除上一次next方法返回的集合元素才可以;否则将会引发java.util.Concurrent ModificationException异常。
这里的描述错误,集合中的元素是可以修改的,具体看上面解释。
Iterator迭代器采用的是快速失败(fail-fast)机制,一旦在迭代过程中检测到该集合已经被修改(通常是程序中的其他线程修改),程序立即引发ConcurrentModificationException异常,而不是显示修改后的结果,这样可以避免共享资源而引发的潜在问题。
检测的时机是在调用next()方法的时候。这里说的修改是增加、删除元素,并不是修改元素的内容。