当前位置:首页 > 技术 > 正文内容

Java集合框架核心概览:深入理解List、Set与Map

访客 技术 2026年7月20日 2

在Java编程中,集合框架是处理对象组的核心工具。它提供了一套标准化的接口和类,用于存储、管理和操作数据。Java集合框架主要由两个根接口派生:CollectionMap,它们各自定义了不同的数据存储和访问方式。

  • Collection 接口:用于存储一组不具备键值关系的对象。它又细分为:
    • List 接口:代表有序的集合,元素可以重复。其实现类如 ArrayListLinkedList 等。
    • Set 接口:代表无序的集合,不允许重复元素。其实现类如 HashSetTreeSet 等。
  • Map 接口:用于存储键值对(Key-Value Pair),其中键(Key)必须是唯一的,值(Value)可以重复。其实现类如 HashMapTreeMapLinkedHashMap 等。

下图展示了Java集合框架的主要继承关系,有助于理解各接口和实现类之间的联系:

Java Collection Hierarchy Diagram

Collection接口与迭代器(Iterator)

Collection 是Java集合框架中所有单值集合的父接口,它定义了添加、删除、检查元素等基本操作。遍历 Collection 中元素最常用的方式是使用 Iterator 迭代器。

示例:HashSet - 无序且不含重复元素

HashSetSet 接口的一个典型实现,它不保证元素的顺序,并且不允许存储重复元素。尝试添加重复元素时,HashSet 会忽略该操作。

import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;

public class SetTraversalDemo {
    public static void main(String[] args) {
        Collection<String> uniqueItems = new HashSet<>();
        uniqueItems.add("Alpha");
        uniqueItems.add("Beta");
        uniqueItems.add("Gamma");
        uniqueItems.add("Delta");
        uniqueItems.add("Epsilon");
        uniqueItems.add("Beta"); // 尝试添加重复元素,将被忽略

        System.out.println("--- HashSet 遍历结果 (顺序不确定) ---");
        Iterator<String> itemIterator = uniqueItems.iterator();
        while (itemIterator.hasNext()) {
            System.out.println(itemIterator.next());
        }
    }
}

输出结果(请注意元素的顺序可能与添加顺序不同,且"Beta"只出现一次):

HashSet Output

示例:LinkedList - 有序且允许重复元素

LinkedListList 接口的实现,它基于双向链表结构。LinkedList 保持元素的添加顺序,并且允许存储重复元素。

import java.util.Collection;
import java.util.LinkedList;
import java.util.Iterator;

public class LinkedListTraversalDemo {
    public static void main(String[] args) {
        Collection<String> orderedItems = new LinkedList<>();
        orderedItems.add("First");
        orderedItems.add("Second");
        orderedItems.add("Third");
        orderedItems.add("Fourth");
        orderedItems.add("Fifth");
        orderedItems.add("Second"); // 允许添加重复元素

        System.out.println("--- LinkedList 遍历结果 (保持添加顺序) ---");
        Iterator<String> listIterator = orderedItems.iterator();
        while (listIterator.hasNext()) {
            System.out.println(listIterator.next());
        }
    }
}

输出结果:

LinkedList Output

示例:ArrayList - 有序且允许重复元素

ArrayList 也是 List 接口的实现,它基于动态数组。与 LinkedList 类似,ArrayList 也保持元素的添加顺序,并允许重复。

import java.util.Collection;
import java.util.ArrayList;
import java.util.Iterator;

public class ArrayListTraversalDemo {
    public static void main(String[] args) {
        Collection<String> dynamicArrayItems = new ArrayList<>();
        dynamicArrayItems.add("ItemA");
        dynamicArrayItems.add("ItemB");
        dynamicArrayItems.add("ItemC");
        dynamicArrayItems.add("ItemD");
        dynamicArrayItems.add("ItemE");
        dynamicArrayItems.add("ItemB"); // 允许添加重复元素

        System.out.println("--- ArrayList 遍历结果 (保持添加顺序) ---");
        Iterator<String> arrayIterator = dynamicArrayItems.iterator();
        while (arrayIterator.hasNext()) {
            System.out.println(arrayIterator.next());
        }
    }
}

输出结果:

ArrayList Output

存储自定义对象与迭代

集合不仅可以存储Java内置类型(如 String),也可以存储我们自定义的对象。当存储自定义对象时,通常需要重写对象的 toString() 方法,以便在打印时能显示有意义的信息。

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

// 定义一个学生类
class Student {
    private String studentName;
    private String gender;

    public Student(String studentName, String gender) {
        this.studentName = studentName;
        this.gender = gender;
    }

    public String getStudentName() {
        return studentName;
    }

    public String getGender() {
        return gender;
    }

    // 重写 toString() 方法,便于打印对象信息
    @Override
    public String toString() {
        return "学生姓名:" + studentName + ",性别:" + gender;
    }
}

public class CustomObjectCollectionDemo {
    public static void main(String[] args) {
        List<Student> studentList = new ArrayList<>(); // 使用泛型指定存储Student对象

        studentList.add(new Student("张明", "男"));
        studentList.add(new Student("李华", "女"));
        studentList.add(new Student("王磊", "男"));
        studentList.add(new Student("赵丽", "女"));

        System.out.println("--- 遍历学生列表 ---");
        Iterator<Student> studentIterator = studentList.iterator();
        while (studentIterator.hasNext()) {
            Student currentStudent = studentIterator.next(); // 使用泛型后无需强制类型转换
            System.out.println(currentStudent); // 自动调用Student的toString()方法
        }
    }
}

增强型for循环 (For-Each Loop)

自JDK 1.5起,Java引入了增强型for循环(也称为for-each循环),它简化了数组和集合的遍历操作,使代码更简洁易读。这种循环适用于任何实现了 Iterable 接口的对象(包括所有 Collection 实现类)以及数组。

import java.util.ArrayList;
import java.util.Collection;

public class EnhancedForLoopDemo {
    public static void main(String[] args) {
        int[] numbers = {10, 20, 30, 40, 50};

        System.out.println("--- 传统for循环遍历数组 ---");
        for (int i = 0; i < numbers.length; i++) {
            System.out.println("元素:" + numbers[i]);
        }
        System.out.println();

        System.out.println("--- 增强型for循环遍历数组 ---");
        for (int num : numbers) {
            System.out.println("元素:" + num);
        }
        System.out.println();

        Collection<String> fruitBasket = new ArrayList<>();
        fruitBasket.add("Apple");
        fruitBasket.add("Banana");
        fruitBasket.add("Cherry");
        fruitBasket.add("Date");

        System.out.println("--- 增强型for循环遍历集合 ---");
        for (String fruit : fruitBasket) {
            System.out.println("水果:" + fruit);
        }
    }
}

Collections工具类:List的实用操作

java.util.Collections 是一个工具类,提供了大量静态方法,用于对各种集合(特别是 List)进行排序、搜索、修改等操作。

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class ListUtilityOperations {
    public static void main(String[] args) {
        List<String> shoppingList = new ArrayList<>();
        for (int i = 1; i <= 5; i++) {
            shoppingList.add("Item-" + i);
        }
        shoppingList.add("Item-1"); // 添加一个重复项

        System.out.println("原始列表: " + shoppingList);

        // 逆序排列
        Collections.reverse(shoppingList);
        System.out.println("逆序后: " + shoppingList);

        // 随机打乱顺序
        Collections.shuffle(shoppingList);
        System.out.println("打乱顺序后: " + shoppingList);

        // 排序 (按自然顺序或自定义比较器)
        Collections.sort(shoppingList);
        System.out.println("排序后: " + shoppingList);

        // 二分查找 (列表必须是有序的,否则结果不可预测)
        int index = Collections.binarySearch(shoppingList, "Item-3");
        System.out.println("'Item-3' 的位置 (基于二分查找): " + index);
        
        index = Collections.binarySearch(shoppingList, "NonExistent");
        System.out.println("'NonExistent' 的位置 (不存在): " + index); // 返回负值
    }
}

输出结果:

Collections Utility Methods Output

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。