进阶JAVA篇- Collection 类的常用的API与 Collection 集合的遍历方式
目录
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 表达式运用还不是很熟悉的话,可以点击以下的链接去了解一下: