当前位置: 首页 > article >正文

List 和 Set 的区别

📌 List 和 Set 的区别

在 Java 中,ListSet 都是 Collection 接口的子接口,但它们的存储结构、特点、使用场景不同。

对比项List(有序、可重复)Set(无序、不可重复)
是否允许重复元素✅ 允许❌ 不允许
是否有序✅ 按插入顺序排序❌ 无序(TreeSet 除外)
是否可以有 null✅ 允许多个 null✅ 只允许一个 null
底层数据结构数组、链表哈希表、红黑树
访问方式通过索引访问通过 iterator 遍历
适用场景需要顺序存储、允许重复元素需要去重、快速查找

1️⃣ List 详解

List有序且允许重复 的集合,主要实现类有:

  • ArrayList(底层是数组,查询快,增删慢)
  • LinkedList(底层是链表,增删快,查询慢)
  • Vector(线程安全,性能较低)

💡 List 使用示例

import java.util.*;

public class ListExample {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("Java");
        list.add("Python");
        list.add("Java");  // ✅ 允许重复

        System.out.println(list);  // [Java, Python, Java]

        // 按索引访问
        System.out.println(list.get(1));  // Python
    }
}

📝 ArrayList vs LinkedList

对比项ArrayListLinkedList
底层结构动态数组双向链表
查询速度✅ 快(O(1))❌ 慢(O(n))
插入/删除速度❌ 慢(O(n))✅ 快(O(1) 或 O(n))
适用场景读操作多的场景增删操作多的场景

2️⃣ Set 详解

Set无序且不允许重复 的集合,主要实现类有:

  • HashSet(底层是 HashMap,无序)
  • LinkedHashSet(底层是 LinkedHashMap,有序)
  • TreeSet(底层是红黑树,自动排序)

💡 Set 使用示例

import java.util.*;

public class SetExample {
    public static void main(String[] args) {
        Set<String> set = new HashSet<>();
        set.add("Java");
        set.add("Python");
        set.add("Java");  // ❌ 不允许重复

        System.out.println(set);  // 可能是 [Python, Java],但无序
    }
}

📝 HashSet vs TreeSet

对比项HashSetTreeSet
底层结构哈希表红黑树
是否有序❌ 无序✅ 自动排序
查询速度✅ 快(O(1))❌ 慢(O(log n))
适用场景需要快速去重需要排序的集合

3️⃣ 什么时候用 List,什么时候用 Set?

使用 List 的情况:

  • 需要 存储有序 的元素。
  • 需要 允许重复 的元素。
  • 需要 按索引访问 元素。

使用 Set 的情况:

  • 需要 去重,不允许存储相同元素。
  • 不关心存储顺序(除非用 LinkedHashSet)。
  • 需要 自动排序(使用 TreeSet)。

🎯 结论

  • List 适用于存储有序、可重复的数据,可以按索引访问。
  • Set 适用于存储无序、不可重复的数据,查询性能较优。

http://www.kler.cn/a/594090.html

相关文章:

  • UI设计中的视觉引导:让用户聚焦关键信息
  • 大语言模型的长思维链推理:综述(上)
  • 【计算机视觉】工业表计读数(1)--基于关键点检测的读数识别方案
  • 系统运营中的数据治理
  • 【AI】AI编程助手:Cursor、Codeium、GitHub Copilot、Roo Cline、Tabnine
  • id: ‘dev.flutter.flutter-plugin-loader‘, version: ‘1.0.0‘怎么解决
  • lunar是一款无第三方依赖的公历 python调用
  • 15-双链表-双链表基本操作
  • Windows电脑 打开 Docker Desktop 提示的“Virtual Machine Platform not enabled”的问题解决
  • MongoDB慢日志查询及索引创建
  • js深拷贝和浅拷贝?
  • 内测之家--网关架构设计与实践指南
  • 基于Java,SpringBoot,Vue,UniAPP智能停车场微信小程序管理系统设计
  • CPP编译与链接过程
  • OpenCV图像拼接(4)图像拼接模块的一个匹配器类cv::detail::BestOf2NearestRangeMatcher
  • GGUF、Transformer、AWQ 详解与关系梳理
  • 单片机引脚的电气属性Electrical properties
  • DataWhale大语言模型--GPT,DeepSeek模型介绍
  • 深入解析 .NET 中的依赖项加载机制:原理、实现与最佳实践
  • 执行adb指令报错:error: more than one device/emulator原因及解决方法