目录
1.0 Collection 类的说明
1.1 Collection 类中的实例方法
2.0 Collection 集合的遍历方式(重点)
2.1 使用迭代器( Iterator )进行遍历
2.2 使用增强型 for 循环进行遍历
2.3 使用 Java 8的 Stream API 进行遍历(使用 Lambda 表达式进行遍历)
1.0 Collection 类的说明
Collection 类是 Java 单列集合框架中的根接口,它是所有单列集合类的父接口。Collection接口有多个实现类,常用有 ArrayList:基于数组实现的动态数组,支持随机访问和快速插入、删除元素。
1.1 Collection 类中的实例方法
代码如下(以举例子的形式来介绍):
import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; public class CollectionAPI { public static void main(String[] args) { //因为 Collection 是接口,故不能直接创建对象, // 那么需要利用它实现类 ArrayList 类,且支持泛型类 Collection<String> collection = new ArrayList<>(); // 1. Collection 中 add() 的实例方法,添加元素 collection.add("二哈"); collection.add("金毛"); collection.add("拉布拉多"); collection.add("中华田园犬"); collection.add("二哈"); System.out.println(collection); //输出结果为:[二哈, 金毛, 拉布拉多, 中华田园犬, 二哈] // 2. Collection 中 size() 的实例方法,获取集合的大小 System.out.println(collection.size()); //输出结果为:5 // 3. Collection 中 contains() 的实例方法, // 判断是否包含某个元素,是则返回true ,不是则返回false System.out.println(collection.contains("二哈")); //输出结果为:true // 4. Collection 中 remove() 的实例方法 // 删除某个元素,如果是该元素是重复的时候,删除的是第一个该元素 collection.remove("二哈"); System.out.println(collection); //输出的结果为:[金毛, 拉布拉多, 中华田园犬, 二哈] // 5. Collection 中 clear() 的实例方法,清空集合中的元素 collection.clear(); System.out.println(collection); //查看集合中的元素,输出结果为: [] // 6. Collection 中 isEmpty() 的实例方法, // 判断集合元素是否为空,是空则放回true,不是空则返回false System.out.println(collection.isEmpty()); //输出结果为:true // 7. Collection 中 toArray() 的实例方法,把集合转化为数组 //先添加一些元素 collection.add("二哈"); collection.add("二哈"); //调用 toArray() 的实例方式,类型是 String 类型, //虽然集合支持泛型,但是在运行的时候会被擦除,所以为了兼容, //建议用所以用 Object[] 类型的数组来接收 Object[] str = collection.toArray(); System.out.println(Arrays.toString(str)); //输出的结果为:[二哈, 二哈] } }
运行结果如下:
2.0 Collection 集合的遍历方式(重点)
先来提出两个疑问,为什么集合遍历不可以用普通的 for 循环?有什么方法可以对集合进行遍历呢?
回答第一个问题:集合遍历不可以用普通的 for 循环,是因为集合类的元素个数是动态变化的,而普通的 for 循环是基于固定的元素个数进行遍历的。当集合类的元素个数发生变化时,普通的 for 循环无法正确遍历所有元素,可能会出现越界等错误。
回答第二个问题:Collection 集合的遍历方式主要有三种:使用迭代器( Iterator )进行遍历、使用增强型 for 循环进行遍历、使用 Lambda 表达式进行遍历(可以使用 Stream 的 forEach() 方法遍历)
2.1 使用迭代器( Iterator )进行遍历
首先通过调用集合的 iterator() 方法获取一个迭代器对象,然后使用 while 循环和迭代器的 hasNext() 和 next() 方法进行遍历。
代码如下:
import java.util.*; public class CollectionAPI { public static void main(String[] args) { Collection<String> c = new ArrayList<>(); c.add("二哈"); c.add("金毛"); c.add("拉布拉多"); c.add("中华田园犬"); //使用迭代器( Iterator )进行遍历: //首先需要通过 iterator() 方法获取一个迭代器对象, Iterator iterator = c.iterator(); //然后使用 while 循环和迭代器的 hasNext() 和 next() 方法进行遍历. while (iterator.hasNext()){ System.out.println(iterator.next()); } } }
运行结果如下:
详解 hasNext() 和 next() 方法,hasNext() 判断当前指向的集合中的元素是否为空,空则返回 false ,反则返回 true 。next() 做了两个动作,第一个动作就是获得了当前的集合元素,第二个动作就是指向下一个集合中的元素。连贯起来就是先得到当前所指向的元素,再指向下一个集合中的元素。
补充: 数组不可以用迭代器,是因为迭代器是集合框架中的一种数据访问方式,而数组不属于集合框架,它是 Java 语言中的一种基本数据结构,所以无法使用迭代器。
2.2 使用增强型 for 循环进行遍历
增强型 for 循环可以直接遍历集合中的元素,无需使用迭代器。但是其中的本质还是使用了迭代器,增强 for 循环就是对迭代器的一种简化写法。
作为常识了解一下:当使用增强型 for 循环遍历一个集合时,编译器会自动为我们生成一个迭代器,并使用迭代器的 hasNext() 和 next() 方法来遍历集合中的元素。所以,虽然我们在使用增强型 for 循环时不需要显式地调用迭代器的方法,但实际上是在间接地使用了迭代器。(增强 for 循环出现的目的就是简化代码)
还有需要注意的是:对于数组,我们不能直接使用迭代器进行遍历。迭代器是用于遍历集合类(如 List、Set 等)的数据结构的工具,而数组不是集合类,它是一种基本的数据结构。然而对于数组,我们可以直接使用增强 for 循环。
代码如下:
import java.util.*; public class CollectionAPI { public static void main(String[] args) { Collection<String> c = new ArrayList<>(); c.add("二哈"); c.add("金毛"); c.add("拉布拉多"); c.add("中华田园犬"); for (String s : c) { System.out.println(s); } } }
运行结果如下:
2.3 使用 Java 8的 Stream API 进行遍历(使用 Lambda 表达式进行遍历)
Java 8 引入了 Stream API,可以使用 Stream 的 forEach() 方法遍历集合中的元素。
集合中提供的 forEach() 实例方法中的参数为匿名内部类 Consumer<> 是函数式接口,需要重写接口内部的 accept() 方法。
本质 forEach() 方法是增强 for 循环,可以看看原代码:
代码如下:
public class CollectionAPI { public static void main(String[] args) { Collection<String> c = new ArrayList<>(); c.add("二哈"); c.add("金毛"); c.add("拉布拉多"); c.add("中华田园犬"); /* c.forEach(new Consumer<String>() { @Override public void accept(String s) { System.out.println(s); } });*/ //之所以可以称为 Lambda 表达式遍历, // 是因为可以用 Lambda 表达式来遍历 c.forEach( s -> System.out.println(s) ); System.out.println("----------------------"); //还可以继续简化 c.forEach( System.out::println); } }
运行结果如下:
如果对匿名内部类或者是 Lambda 表达式运用还不是很熟悉的话,可以点击以下的链接去了解一下:
进阶JAVA篇- Lambda 表达式与 Lambda 表达式的省略规则-CSDN博客