进阶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博客



相关推荐
白开水不加冰6 分钟前
Spring的BeanFactory和FactoryBean的区别
java·后端·spring
旋风菠萝12 分钟前
八股文--JVM(2)
java·jvm·八股文·java八股
建鼎呓语12 分钟前
使用国内源加速Qt在线安装
开发语言·qt
漫谈网络16 分钟前
Python 包管理工具 uv
开发语言·python·uv
fashia16 分钟前
Java转Go日记(三十六):简单的分布式
开发语言·分布式·后端·zookeeper·golang·go
bst@微胖子21 分钟前
DeepSeek提示工程Prompt Engineering
java·数据库·prompt
咪嗷喵挖藕哇24 分钟前
leetcode 合并区间 java
java·算法·leetcode
秃头小白菜1 小时前
Python之三大基本库——Matplotlib
开发语言·python·matplotlib
江-小北1 小时前
10万字86道Java多线程经典面试题(2025修订版)
java·java面试题·java并发面试题·java多线程面试题
Hygge-star1 小时前
【算法】定长滑动窗口5.20
java·数据结构·算法·学习方法·代码规范