首页 > 编程笔记 > Java笔记

Java集合类(Collection和Map)详解

Java 的集合类是一些常用的数据结构,如列表、树集和哈希表等。

Java 集合就像一个容器,专门用来存储数量不等的对象(实际上是对象的引用,但习惯称为对象),这些对象可以是任意数据类型,并且长度可变,可以按照规范实现一些常用的操作和算法。开发者在使用 Java 的集合类时,不必考虑数据结构和算法的具体实现细节,根据需要直接使用这些集合类,调用相应的方法即可,从而提高开发效率。

集合框架的层次结构

Java 所有的集合类都位于 java.util 包中,按照存储结构可以分为两大类,即单列集合 Collection 和双列集合 Map。Collection 和 Map 是集合框架的根接口,各自还派生出了一些子接口或实现类。

Collection 集合体系的架构图如下图所示,其中,实线表示实现关系,虚线表示继承关系。


图 1 Collection集合体系的架构图

Collection 接口有以下 3 个子接口:
Collection 是所有单列集合的根接口,因此,在 Collection 接口中定义了单列集合的一些通用方法,使用这些方法可以操作所有的单列集合。Collection 接口中的主要方法如下表所示。

表:Collection 接口中的主要方法
方法声明 功能描述
boolean add(E e) 向集合中添加新元素。
boolean addA1l(Collection c) 将指定集合的所有元素添加到当前集合中。
boolean remove(Object o) 删除当前集合中包含的指定元素。
void clear() 删除当前集合中的所有元素。
boolean contains(Obiect o) 如果该集合中包含指定元素,那么返回 true。
boolean containsAll(Collection c) 如果该集合中包含集合 c 的所有元素,那么返回 true。
boolean isEmpty() 当前集合是否为空。
Iterator iterator() 返回一个 Iterator 对象,可以用来遍历当前集合。
boolean retainAll(Collection c) 保留当前集合中与指定集合相同的所有元素,若该操作改变了当前集合,则返回 true。
int size() 返回当前集合中元素的数目。
Object[] toArray() 返回当前集合中所有元素组成的数组。

实例:
import java.util.ArrayList;
import java.util.List;

public class CollectionExample {
    public static void main(String[] args) {
        // 创建一个List集合
        List<String> fruits = new ArrayList<>();
       
        // 向集合中添加元素
        fruits.add("Apple");
        fruits.add("Banana");
        fruits.add("Cherry");
       
        // 访问集合中的元素
        for (String fruit : fruits) {
            System.out.println(fruit);
        }
       
        // 检查集合是否包含某个元素
        if (fruits.contains("Banana")) {
            System.out.println("Fruits list contains Banana.");
        }
       
        // 从集合中移除元素
        fruits.remove("Cherry");
       
        // 获取集合的大小
        System.out.println("Number of fruits: " + fruits.size());
    }
}
运行结果为:

Apple
Banana
Cherry
Fruits list contains Banana.
Number of fruits: 2


Map 集合体系的架构图如下图所示,其中,实线表示继承关系,虚线表示实现关系。


图 2 Map集合体系的架构图

Map 接口的实现类用于保存具有映射关系的数据,即 Map 保存的每项数据都是由“键(Key)/值(Value)”对组成的。Map 中的键是不可重复的,用于标识集合中的每项数据,通过键可以获取 Map 集合中的数据项,即值。

实例:
import java.util.HashMap;
import java.util.Map;

public class MapExample {
    public static void main(String[] args) {
        // 创建一个Map集合
        Map<String, Integer> ageMap = new HashMap<>();
       
        // 向Map中添加键值对
        ageMap.put("Alice", 25);
        ageMap.put("Bob", 30);
        ageMap.put("Charlie", 22);
       
        // 访问Map中的元素
        for (Map.Entry<String, Integer> entry : ageMap.entrySet()) {
            System.out.println(entry.getKey() + " is " + entry.getValue() + " years old.");
        }
       
        // 通过键获取值
        int aliceAge = ageMap.get("Alice");
        System.out.println("Alice's age: " + aliceAge);
       
        // 检查Map是否包含某个键
        if (ageMap.containsKey("Bob")) {
            System.out.println("Age map contains Bob.");
        }
       
        // 从Map中移除键值对
        ageMap.remove("Charlie");
       
        // 获取Map的大小
        System.out.println("Number of people: " + ageMap.size());
    }
}
运行结果为:

Bob is 30 years old.
Alice is 25 years old.
Charlie is 22 years old.
Alice's age: 25
Age map contains Bob.
Number of people: 2

迭代器接口

迭代器(Iterator)接口是 Java 集合框架中的一员,诞生于 JDK 1.2,主要用于迭代访问(即遍历)Collection 中的元素,因此,Iterator 也被称为迭代器。

虽然 Iterator 是一个接口,但是开发者无须手动开发 Iterator 接口的实现类。这是因为 Collection 接口的实现类中均已提供了对应的 Iterator 接口的实现类。开发者直接调用 Collection 接口的 iterator() 方法,即可获取当前集合对象对应的迭代器对象。

Iterator 接口中的方法如下表所示。

表:Iterator接口中的方法
方法声明 功能描述
default void forEachRemaining (Consumer<?super E> action) 对每个剩余元素执行给定的操作,直到所有元素都被处理或动作引发异常。
boolean hasNext() 判断是否有下一个可访问的元素,若有则返回 true,否则返回 false。
E next() 返回下一个元素。
void remove() 删除当前元素,该方法必须紧跟在一个元素的访问后执行。
forEach() 从JDK 1.8 开始提供,该方法所需的参数是 Lambda 表达式,使集合的迭代操作更加简化。

实例:
import java.util.ArrayList;
import java.util.Iterator;

public class IteratorExample {
    public static void main(String[] args) {
        // 创建一个List集合
        ArrayList<String> numbers = new ArrayList<>();
        numbers.add("One");
        numbers.add("Two");
        numbers.add("Three");
       
        // 获取迭代器
        Iterator<String> iterator = numbers.iterator();
       
        // 使用迭代器遍历集合
        while (iterator.hasNext()) {
            String number = iterator.next();
            System.out.println(number);
        }
       
        // 使用迭代器移除元素
        iterator = numbers.iterator();
        while (iterator.hasNext()) {
            if ("Two".equals(iterator.next())) {
                iterator.remove();
            }
        }
       
        // 再次打印集合以验证元素已被移除
        System.out.println("After removal: " + numbers);
    }
}
运行结果为:

One
Two
Three
After removal: [One, Three]


声明:《Java系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。