目录
一、集合框架体系(重要)
二、集合引入
(一)集合的理解与好处
三、Collection接口
(一)Collection接口实现类的特点
(二)Collection接口常用方法
(三)Collection接口遍历元素的方式(Iterator和增强for)
1.使用Iterator(迭代器)
1.1Iterator(迭代器)介绍
1.2Iterator(迭代器)执行原理
1.3Iterator使用
(1)定义一个Student类
(2)创建一个ArrayList集合,并存入多个Student对象与其他元素:
(3)普通打印方式:
(4)使用迭代器遍历集合元素:
(5)迭代器遍历集合快捷键:
(6)集合遍历完成后,如果再次使用iterator.next()方法,就会报错:
(7)如果想要再次遍历集合,需要对迭代器进行重置:
2.使用增强for循环
3.练习题:使用迭代器和for循环遍历同一个集合
一、集合框架体系(重要)
单列集合:集合中都是单个元素
双列集合:集合中存放的是键值对(K-V)
二、集合引入
(一)集合的理解与好处
之前我们保存多个数据使用的是数组,但是数组也有不足的地方:
- 数组长度在开始时必须指定,而一旦指定,就不能再更改
- 数组保存的必须为同一类型的元素
- 使用数组进行增加/删除元素比较麻烦
例如:
给Person数组扩容:
Person[] pers = new Person[1];
per[0] = new Person();
给Person数组增加新的Person对象:
Person[] pers2 = new Person[pers.length+1]; // 创建新的Person数组
for(){} // 拷贝pers数组的元素到pers2
pers2[pers.length-1] = new Person(); // 添加新的对象
通过上述代码可以看出,数组扩缩容的灵活度较低,集合可以很好地解决这个问题。
集合的好处:
- 可以动态保存任意多个对象,使用比较方便
- 集合提供了一系列方便操作对象的方法:add、remove、set、get等
- 使用集合添加、删除新元素方便高效
三、Collection接口
(一)Collection接口实现类的特点
public interface Collection<E> extends Iterable<E>
- collection实现子类可以存放多个元素,每个元素可以是Object
- 有些Collection的实现类,可以存放重复的元素,有些不可以
- 有些Collection的实现类,有些是有序的(List),有些无序的(Set)
- Collection接口没有直接的实现子类,是通过它的子接口List和Set来实现的
(二)Collection接口常用方法
因为接口不能被实例化,只有实现了接口的类才能被实例化,所以Collection接口常用的方法,以实现子类ArrayList来演示说明:
add:添加元素
remove:删除某个元素
contains:查找指定元素是否存在
size:返回元素的个数
isEmpty:判断集合是否为空
clear:清空集合中的数据
addAll:添加多个元素
containsAll:查找多个元素是否都存在
removeAll:删除多个元素
public static void main(String[] args) {
// 创建ArrayList对象,并用List接口来接收
List list = new ArrayList();
// 1.add:添加元素
list.add("jack");
list.add(10); // 相当于:list.add(new Integer(10));
list.add(true);
System.out.println("list=" + list);
// 都采用了自动装箱,list中的元素都是对象,不再是基本数据类型
// list=[jack, 10, true]
// 2.remove:删除某个元素
list.remove(0); // 根据索引删除
list.remove("jack"); // 指定删除某个元素
System.out.println("list=" + list); // list=[10, true]
// 3.contains:查找指定元素是否存在
System.out.println(list.contains("jack")); // false
// 4.size:返回元素的个数
System.out.println(list.size()); // 2
// 5.isEmpty:判断集合是否为空
System.out.println(list.isEmpty()); // false
// 6.clear:清空集合中的数据
list.clear();
System.out.println("list=" + list); // list=[]
// 7.addAll:添加多个元素
ArrayList list2 = new ArrayList();
list2.add("红楼梦");
list2.add("三国演义");
list.addAll(list2);
System.out.println("list=" + list); // list=[红楼梦, 三国演义]
// 8.containsAll:查找多个元素是否都存在
System.out.println(list.containsAll(list2)); // true
// 9.removeAll:删除多个元素
list.add("聊斋");
list.removeAll(list2);
System.out.println("list=" + list); // list=[聊斋]
}
(三)Collection接口遍历元素的方式(Iterator和增强for)
1.使用Iterator(迭代器)
1.1Iterator(迭代器)介绍
我们知道,Collection的所有子类都实现了Collection接口,但是Collection接口也继承了Iterable接口。
public interface Collection<E> extends Iterable<E>
Iterable接口有一个非常重要的抽象方法:通过这个iterator()方法,返回一个Iterator(迭代器)接口。通过Iterator接口,可以实现集合中所有元素的遍历。
因此:凡是实现了Collection接口的子类,都可以获取到iterator()方法,从而获取到Iterator(迭代器)接口,最后实现集合中所有元素的遍历。
注意:Iterator仅用于遍历集合,本身并不存放对象。
1.2Iterator(迭代器)执行原理
Iterator iterator = coll.iterator(); // 得到一个集合的迭代器
使用iterator的hasNext():判断是否还有下一个元素
while(iterator.hasNext()){
调用next()方法:1.下移 2.将下移以后的集合位置上的元素返回
System.out.println(iterator.next());
}
注意:在调用iterator.next()方法之前,必须要调用iterator.hasNext()进行检测。如果不调用,且下一条记录无效,直接调用iterator.next()会抛出NoSuchElementException异常。
1.3Iterator使用
(1)定义一个Student类
class Student {
private String name;
private String author;
private double price;
public Student(String name, String author, double price) {
this.name = name;
this.author = author;
this.price = price;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", author='" + author + '\'' +
", price=" + price +
'}';
}
}
(2)创建一个ArrayList集合,并存入多个Student对象与其他元素:
public class CollectionIterator {
public static void main(String[] args) {
Collection coll = new ArrayList();
coll.add(new Student("三国演义", "罗贯中", 41.5));
coll.add(new Student("红楼梦", "曹雪芹", 31.58));
coll.add(new Student("西游记", "吴承恩", 65.74));
coll.add(new Student("水浒传", "施耐庵", 76.24));
coll.add("marry");
}
}
(3)普通打印方式:
System.out.println("coll=" + coll);
// coll=[Student{name='三国演义', author='罗贯中', price=41.5},
// Student{name='红楼梦', author='曹雪芹', price=31.58},
// Student{name='西游记', author='吴承恩', price=65.74},
// Student{name='水浒传', author='施耐庵', price=76.24}, marry]
(4)使用迭代器遍历集合元素:
// 对coll集合进行遍历:
// 1.先得到coll对应的迭代器
Iterator iterator = coll.iterator();
// 2.使用while循环遍历
while (iterator.hasNext()) {
// 返回Object类型是因为集合中可以存放各种类型的数据
// 编译类型虽然是Object,但是运行类型还要看集合中真正存放的数据类型
Object next = iterator.next();
System.out.println(next);
}
/*
Student{name='三国演义', author='罗贯中', price=41.5}
Student{name='红楼梦', author='曹雪芹', price=31.58}
Student{name='西游记', author='吴承恩', price=65.74}
Student{name='水浒传', author='施耐庵', price=76.24}
marry
*/
(5)迭代器遍历集合快捷键:
使用迭代器快捷键 itit + 回车
显示所有快捷键的快捷键:Ctrl + J
(6)集合遍历完成后,如果再次使用iterator.next()方法,就会报错:
// 当退出while循环后,这时iterator迭代器指向最后的元素
// iterator.next(); // 会抛出NoSuchElementException
(7)如果想要再次遍历集合,需要对迭代器进行重置:
iterator = coll.iterator();
while (iterator.hasNext()) {
Object obj = iterator.next();
System.out.println(obj);
}
2.使用增强for循环
增强for循环底层使用的仍然是iterator迭代器,是iterator的简化版。增强for循环只能用于遍历集合或数组。
基本语法:
for(元素类型 元素名 : 集合名或数组名){
访问元素
}
代码示例:
public class CollectionFor {
public static void main(String[] args) {
Collection coll = new ArrayList();
coll.add(new Student("三国演义", "罗贯中", 41.5));
coll.add(new Student("红楼梦", "曹雪芹", 31.58));
coll.add(new Student("西游记", "吴承恩", 65.74));
coll.add(new Student("水浒传", "施耐庵", 76.24));
coll.add("marry");
// 使用增强for遍历集合
for (Object element : coll) {
System.out.println(element);
}
/**
* Student{name='三国演义', author='罗贯中', price=41.5}
* Student{name='红楼梦', author='曹雪芹', price=31.58}
* Student{name='西游记', author='吴承恩', price=65.74}
* Student{name='水浒传', author='施耐庵', price=76.24}
* marry
*/
}
}
3.练习题:使用迭代器和for循环遍历同一个集合
public class CollectionExercise {
public static void main(String[] args) {
// 这里也可以使用List接收,因为接口的多态性
// List实现了Collection接口,也可以调用iterator
List list = new ArrayList();
list.add(new Dog("斑点狗", 2));
list.add(new Dog("哈士奇", 3));
list.add(new Dog("阿拉斯加", 1));
// 迭代器
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
Object dog = iterator.next();
System.out.println(dog);
}
// 增强for
for (Object dog : list) {
System.out.println(dog);
}
}
}
class Dog {
private String name;
private int age;
public Dog(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Dog{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}