1.1 Collection接口
1.1.1 集合概述
出现意义:面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式。
Java中的集合: JDK为我们提供了一套完整的容器类库,这些容器可以用于存储各种类型的对象,并且长度都是可变的,我们把这些类统称为集合类,它们都位于java.util包中。
1.1.2 Collection概念
Collection是所有单列集合的直接或间接接口,其指定了所有集合应该具备的功能。
AbstractCollection是实现了Collection接口的抽象父类。
Collection与AbstractCollection均无法直接使用,需要使用其具体实现类。下图是强调功能的集合体系图,实线黑框为具体实现类。我们可以从中任意挑选一个以多态形式演示Collection的方法。
1.1.3 Collection通用方法
主要方法
boolean add(E e) //添加元素
boolean remove(Object o) //删除元素
void clear() //清空集合
boolean contains(Object o) //判断是否包含某元素
boolean isEmpty() //判断是否为空
int size() //获取集合长度
1.2 增强for循环
如果使用多态,我们发现之前所使用的ArrayList子类中的带索引方法均为ArrayList自身特有方法,并非Collection接口或者AbstractColletion类中的方法。(实际上我们只需要关心Collection中的方法,因为接口中规定了要实现的核心功能方法,类只负责实现,这样更一步分离了功能的定义与实现)。
所以所有集合的通用功能中,不包含通过索引访问元素的方法,则无法通过索引获取元素。实际开发中,我最常使用的是foreach循环(又叫增强for循环)来完成元素的获取。
增强for循环用来迭代集合或数组,格式如下:
for(容器内类型临时变量:容器) {
内部可以直接使用临时变量访问数据
}
1.3 迭代器
集合用来持有数据,一定会设计出对数据的增、删、改、查四个常用方法,而查是集合中最常用的功能。Collection接口继承了Iterable接口,具备了可迭代功能iterator方法,该方法用于迭代集合。所以,所有单列集合由于是Collection的直接或间接实现类,均具有该方法。
这里涉及到以下内容共同完成集合的迭代:
Collection接口的iterator方法,所以单列集合实现类均有该方法
iterator方法的返回值类型Iterator接口类型
Iterator接口的两个方法:hasNext与next方法
下边分别介绍以上内容:
a) Collection接口的Iterator
方法声明为:
Iterator<集合中数据类型> iterator()
用来返回专属于该集合对象的迭代器对象(Iterator的子类对象)。
b) Iterator接口
该接口规定了迭代集合所需要的方法
c) Iterator接口的两个方法:hasNext与next方法
Iterator规定了两个方法,集合对象产生的迭代器对象正是通过这两个方法帮助集合进行迭代工作的。
调用迭代器的hasNext方法判断是否有下一个元素
调用迭代器的next获取下一个元素
d) 迭代常规步骤
1:通过集合获取这个集合的迭代器
2:结合使用迭代器的hashNext与next完成集合迭代
如 ArryList<String> list = new ArryList <String>();
hs.add("i love java");
hs.add("i like java");
//返回迭代器
Iterator<String> iterator = list.iterator();
//调用hasNext与next完成集合迭代
while (iterator.hasNext()) {
String string = iterator.next();
System.out.println(string);
}
1.4 并发修改异常
迭代的常规用法中我们要尽量避免在迭代过程中为集合添加/删除数据。否则会报错,原因是Java抛出了并发修改异常。
迭代过程中并发修改异常的原因为迭代器中”记忆”的集合长度与集合中实际长度不同,而导致出现索引与实际元素不符甚至无限循环的情况发生。
所以在使用Iterator时,避免类似操作,for循环底层为迭代器实现,所以也需要避免类似操作。
有些迭代器避免了这样的问题,如ListIterator,但该类并不通用也不常用,实际开发中很少使用,只需要简单了解。