进阶JAVA篇- Collection 类的常用的API与 Collection 集合的遍历方式

目录

[1.0 Collection 类的说明](#1.0 Collection 类的说明)

[1.1 Collection 类中的实例方法](#1.1 Collection 类中的实例方法)

[2.0 Collection 集合的遍历方式(重点)](#2.0 Collection 集合的遍历方式(重点))

[2.1 使用迭代器( Iterator )进行遍历](#2.1 使用迭代器( Iterator )进行遍历)

[2.2 使用增强型 for 循环进行遍历](#2.2 使用增强型 for 循环进行遍历)

[2.3 使用 Java 8的 Stream API 进行遍历(使用 Lambda 表达式进行遍历)](#2.3 使用 Java 8的 Stream API 进行遍历(使用 Lambda 表达式进行遍历))


1.0 Collection 类的说明

Collection 类是 Java 单列集合框架中的根接口,它是所有单列集合类的父接口。Collection接口有多个实现类,常用有 ArrayList:基于数组实现的动态数组,支持随机访问和快速插入、删除元素。

1.1 Collection 类中的实例方法

代码如下(以举例子的形式来介绍):

java 复制代码
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() 方法进行遍历。

代码如下:

java 复制代码
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 循环。

代码如下:

java 复制代码
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 循环,可以看看原代码:

代码如下:

java 复制代码
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博客



相关推荐
你知道“铁甲小宝”吗丶7 分钟前
【第33章】Spring Cloud之SkyWalking服务链路追踪
java·spring boot·spring·spring cloud·skywalking
虚假程序设计10 分钟前
pythonnet python图像 C# .NET图像 互转
开发语言·人工智能·python·opencv·c#·.net
归寻太乙15 分钟前
C++函数重载完成日期类相关计算
开发语言·c++
尽蝶叙18 分钟前
C++:分苹果【排列组合】
开发语言·c++·算法
coffee_baby19 分钟前
化繁为简:中介者模式如何管理复杂对象交互
java·spring boot·microsoft·交互·中介者模式
ღ᭄ꦿ࿐Never say never꧂23 分钟前
微服务架构中的负载均衡与服务注册中心(Nacos)
java·spring boot·后端·spring cloud·微服务·架构·负载均衡
所待.38324 分钟前
小小扑克牌算法
java·算法
.生产的驴32 分钟前
SpringBoot 消息队列RabbitMQ 消息确认机制确保消息发送成功和失败 生产者确认
java·javascript·spring boot·后端·rabbitmq·负载均衡·java-rabbitmq
.生产的驴32 分钟前
SpringBoot 消息队列RabbitMQ在代码中声明 交换机 与 队列使用注解创建
java·spring boot·分布式·servlet·kafka·rabbitmq·java-rabbitmq
憧憬成为原神糕手43 分钟前
c++_list
开发语言·c++