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



相关推荐
P.H. Infinity21 分钟前
【RabbitMQ】04-发送者可靠性
java·rabbitmq·java-rabbitmq
生命几十年3万天25 分钟前
java的threadlocal为何内存泄漏
java
caridle37 分钟前
教程:使用 InterBase Express 访问数据库(五):TIBTransaction
java·数据库·express
萧鼎40 分钟前
Python并发编程库:Asyncio的异步编程实战
开发语言·数据库·python·异步
学地理的小胖砸40 分钟前
【一些关于Python的信息和帮助】
开发语言·python
疯一样的码农41 分钟前
Python 继承、多态、封装、抽象
开发语言·python
^velpro^42 分钟前
数据库连接池的创建
java·开发语言·数据库
苹果醋31 小时前
Java8->Java19的初步探索
java·运维·spring boot·mysql·nginx
秋の花1 小时前
【JAVA基础】Java集合基础
java·开发语言·windows
小松学前端1 小时前
第六章 7.0 LinkList
java·开发语言·网络