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

List 和 Set的核心区别

一、核心区别

特性ListSet
元素唯一性允许重复元素不允许重复元素
元素顺序有序(按插入顺序或索引访问)无序(HashSet)或按特定顺序(TreeSet
实现类ArrayListLinkedListVectorHashSetLinkedHashSetTreeSet
查找性能按索引查找快(ArrayList 为 O(1))查找元素快(HashSet 为 O(1))
适用场景需要保留插入顺序或允许重复元素的场景需要去重或快速查找元素的场景

二、详细对比

1. 元素唯一性

  • List

    • 允许存储重复元素。

    • 示例:

      List<String> list = new ArrayList<>();
      list.add("Apple");
      list.add("Banana");
      list.add("Apple"); // 允许重复
      System.out.println(list); // 输出: [Apple, Banana, Apple]
  • Set

    • 不允许存储重复元素。

    • 示例:

      Set<String> set = new HashSet<>();
      set.add("Apple");
      set.add("Banana");
      set.add("Apple"); // 重复元素,不会被添加
      System.out.println(set); // 输出: [Apple, Banana]

2. 元素顺序

  • List

    • 元素按插入顺序存储,可以通过索引访问。

    • 示例:

      List<String> list = new ArrayList<>();
      list.add("Apple");
      list.add("Banana");
      list.add("Cherry");
      System.out.println(list.get(1)); // 输出: Banana
  • Set

    • 元素无序(HashSet)或按特定顺序存储(TreeSet 按自然顺序,LinkedHashSet 按插入顺序)。

    • 示例:

      Set<String> hashSet = new HashSet<>();
      hashSet.add("Apple");
      hashSet.add("Banana");
      hashSet.add("Cherry");
      System.out.println(hashSet); // 输出: [Apple, Cherry, Banana](无序)
      
      Set<String> linkedHashSet = new LinkedHashSet<>();
      linkedHashSet.add("Apple");
      linkedHashSet.add("Banana");
      linkedHashSet.add("Cherry");
      System.out.println(linkedHashSet); // 输出: [Apple, Banana, Cherry](按插入顺序)
      
      Set<String> treeSet = new TreeSet<>();
      treeSet.add("Banana");
      treeSet.add("Apple");
      treeSet.add("Cherry");
      System.out.println(treeSet); // 输出: [Apple, Banana, Cherry](按自然顺序)

3. 实现类

  • List

    • ArrayList:基于动态数组实现,随机访问快,插入删除慢。

    • LinkedList:基于双向链表实现,插入删除快,随机访问慢。

    • Vector:线程安全的动态数组(已过时,推荐使用 Collections.synchronizedList 或 CopyOnWriteArrayList)。

  • Set

    • HashSet:基于哈希表实现,元素无序。

    • LinkedHashSet:基于哈希表和链表实现,元素按插入顺序排序。

    • TreeSet:基于红黑树实现,元素按自然顺序或指定比较器排序。


4. 查找性能

  • List

    • 按索引查找快(ArrayList 为 O(1))。

    • 查找元素慢(需要遍历,时间复杂度为 O(n))。

    • 示例:

      List<String> list = new ArrayList<>();
      list.add("Apple");
      list.add("Banana");
      list.add("Cherry");
      System.out.println(list.get(1)); // 输出: Banana(O(1))
      System.out.println(list.contains("Banana")); // 输出: true(O(n))
  • Set

    • 查找元素快(HashSet 为 O(1))。

    • 示例:

      Set<String> set = new HashSet<>();
      set.add("Apple");
      set.add("Banana");
      set.add("Cherry");
      System.out.println(set.contains("Banana")); // 输出: true(O(1))

5. 适用场景

  • List

    • 需要保留插入顺序(如日志记录、用户操作记录)。

    • 允许重复元素(如购物车中的商品)。

    • 需要按索引访问元素(如随机访问列表中的元素)。

  • Set

    • 需要去重(如统计唯一用户 ID)。

    • 需要快速查找元素(如黑名单检查)。

    • 需要按特定顺序存储元素(如按字母顺序排序的单词列表)。


三、总结

特性ListSet
元素唯一性允许重复不允许重复
元素顺序有序无序或按特定顺序
查找性能按索引快,查找元素慢查找元素快
实现类ArrayListLinkedListVectorHashSetLinkedHashSetTreeSet
适用场景保留顺序、允许重复、按索引访问去重、快速查找、按特定顺序存储

根据具体需求选择合适的集合类型:

  • 如果需要保留顺序或允许重复元素,使用 List

  • 如果需要去重或快速查找元素,使用 Set


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

相关文章:

  • Docker搭建MySQL主从服务器
  • Windows 图形显示驱动开发-WDDM 3.0功能- 硬件翻转队列(五)
  • 【Java进阶学习 第九篇】常用API(Array、冒泡选择排序、二分查找、正则表达式)
  • SpringData Elasticsearch:索引管理与全文检索
  • c++基础知识--返回值优化
  • Java Web应用程序实现用户登录、学生信息管理和验证码验证以及页面跳转等基本功能(IDEA)含(Ajax、JSTL)
  • 如何用AI轻松实现PPT自动生成,让工作更高效
  • IntelliJ IDEA 中 Git 高频问题与操作详解|新手避坑指南
  • 【css酷炫效果】纯CSS实现照片堆叠效果
  • Profinet转Modbus RTU/TCP以太网通讯处理器
  • 2025-03-19 学习记录--C/C++-C语言-单链表的按位查找和按值查找
  • 【图像处理基石】什么是HDR图片?
  • 单表查询和多表查询
  • 工业相机选型
  • Java:Arrays类:操作数组的工具类
  • SpringBoot学习(三)SpringBoot整合JSP以及Themeleaf
  • 牛客C语言day1:异或、数组、带参宏、inline等
  • 蓝桥刷题note6(位异或,只出现一次的数字,找不同)
  • 鸿蒙数据持久化之首选项
  • 正则表达式(可用于MySQL、C++、Python)