List、Set、Map详解和区别

[复制链接]
发表于 2025-12-23 17:16:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
在 Java 中,List、Set、Map是常用的聚集范例,它们各自具有差异的特点和用途,以下是对它们的详细先容及区别分析:
List(列表)


  • 特点

    • 有序性:List中的元素是有序的,即元素的存入序次和取出序次是同等的。比方,先存入元素 A,再存入元素 B,那么按照序次取出时,会先得到 A,然后是 B。
    • 可重复性:答应存储重复的元素。可以在同一个 List 中多次添加雷同的对象。
    • 元素可通过索引访问:可以或许通过索引(下标)来获取、修改或删除元素,索引从 0 开始,就像操纵数组一样方便。比方,可以利用 list.get(0) 获取列表中的第一个元素。

  • 常见实现类及用法

    • ArrayList

      • 内部基于数组实现,查询服从高,由于可以通过数组下标直接定位元素。比方,在一个存储大量门生信息的 ArrayList 中查找某个门生的信息,通过索引访问速率很快。
      • 但是在举行频仍的插入和删除操纵(尤其是在列表中心位置操纵)时,服从相对较低,由于须要移动后续元向来包管序次和一连性。示例代码如下:               
        1. import java.util.ArrayList;
        2. import java.util.List;
        3. public class ArrayListExample {
        4.     public static void main(String[] args) {
        5.         List<String> arrayList = new ArrayList<>();
        6.         arrayList.add("Apple");
        7.         arrayList.add("Banana");
        8.         arrayList.add("Apple");  // 允许重复添加
        9.         System.out.println(arrayList.get(0));  // 通过索引获取元素
        10.         arrayList.remove(1);  // 删除指定索引位置的元素
        11.     }
        12. }
        复制代码

    • LinkedList

      • 内部基于链表结构实现,在举行插入和删除操纵时服从较高,尤其是在链表的首尾位置举行操纵。比方,在实现一个队列大概栈的数据结构时,利用 LinkedList 会很方便。
      • 不外,查询服从相对 ArrayList 较低,由于要遍历链表节点来查找元素。示例代码如下:               
        1. import java.util.LinkedList;
        2. import java.util.List;
        3. public class LinkedListExample {
        4.     public static void main(String[] args) {
        5.         List<String> linkedList = new LinkedList<>();
        6.         linkedList.add("Dog");
        7.         linkedList.add("Cat");
        8.         linkedList.addFirst("Bird");  // 在链表头部添加元素
        9.         linkedList.addLast("Fish");  // 在链表尾部添加元素
        10.         System.out.println(linkedList.get(0));  // 通过索引获取元素
        11.     }
        12. }
        复制代码


Set(聚集)


  • 特点

    • 无序性:元素在 Set 中是没有特定序次的,每次遍历元素的序次大概都不一样,差异的实现类详细的存储序次规则也差异。
    • 不可重复性:不答应存在重复的元素,即假如实验添加一个已经在聚会会议合的元素,添加操纵将不会收效。

  • 常见实现类及用法

    • HashSet

      • 基于哈希表实现,添加、删除和查询操纵的服从通常都比力高。它通过盘算元素的哈希值来确定元素在聚会会议合的存储位置,当两个元素的哈希值雷同时,会进一步通过 equals 方法来判定是否为同一个元素。比方,存储一组门生的学号,用 HashSet 可以包管学号不会重复。示例代码如下:               
        1. import java.util.HashSet;
        2. import java.util.Set;
        3. public class HashSetExample {
        4.     public static void main(String[] args) {
        5.         Set<String> hashSet = new HashSet<>();
        6.         hashSet.add("Red");
        7.         hashSet.add("Blue");
        8.         hashSet.add("Red");  // 重复元素不会被添加
        9.         System.out.println(hashSet.contains("Blue"));  // 检查元素是否存在
        10.     }
        11. }
        复制代码

    • TreeSet

      • 基于红黑树实现,元素会按照天然序次(假如元素类实现了 Comparable 接口)大概指定的比力器序次举行排序存储,同时包管元素的不可重复性。比方,存储一组整数并渴望它们自动按从小到大的序次分列,就可以利用 TreeSet。示例代码如下:               
        1. import java.util.Set;
        2. import java.util.TreeSet;
        3. public class TreeSetExample {
        4.     public static void main(String[] args) {
        5.         Set<Integer> treeSet = new TreeSet<>();
        6.         treeSet.add(5);
        7.         treeSet.add(3);
        8.         treeSet.add(7);
        9.         for (Integer num : treeSet) {
        10.             System.out.println(num);  // 元素按顺序输出
        11.         }
        12.     }
        13. }
        复制代码


Map(映射)


  • 特点

    • 存储键值对:Map 是一种用于存储键(Key)和值(Value)的聚集,每个键对应一个唯一的值,通过键可以快速查找、获取对应的的值。
    • 键的唯一性:键在同一个 Map 中是不答应重复的,假如添加重复的键,反面添加的值会覆盖前面的值。
    • 无序性(一样平常情况):大部门常见的 Map 实现类,如 HashMap,元素的存储序次是不固定的,不外也有一些有序的 Map 实现类,比如 LinkedHashMap 可以保持插入序次,TreeMap 可以按照键的序次存储元素。

  • 常见实现类及用法

    • HashMap

      • 基于哈希表实现,提供了高效的键值对存储和检索功能,是最常用的 Map 实现类。比方,在一个门生信息管理体系中,可以用门生的学号作为键,门生对象(包罗姓名、结果等信息)作为值,方便地举行信息查询和更新。示例代码如下:               
        1. import java.util.HashMap;
        2. import java.util.Map;
        3. public class HashMapExample {
        4.         public static void main(String[] args) {
        5.                 Map<String, String> hashMap = new HashMap<>();
        6.                 hashMap.put("name", "Alice");
        7.                 hashMap.put("age", "20");
        8.                 System.out.println(hashMap.get("name"));  // 通过键获取值
        9.                 hashMap.put("name", "Bob");  // 覆盖之前键为"name"的值
        10.         }
        11. }
        复制代码

    • LinkedHashMap

      • 继承自 HashMap,在保持了 HashMap 的高效性能的同时,还能按照插入序次来纪录键值对,方便在须要保存操纵序次的场景中利用。比方,记任命户操纵的汗青纪录,以操纵的时间戳作为键,操纵详情作为值,按照操纵发生的先后序次存储在 LinkedHashMap 中。示例代码如下:               
        1. import java.util.LinkedHashMap;
        2. import java.util.Map;
        3. public class LinkedHashMapExample {
        4.     public static void main(String[] args) {
        5.         Map<String, String> linkedHashMap = new LinkedHashMap<>();
        6.         linkedHashMap.put("key1", "value1");
        7.         linkedHashMap.put("key2", "value2");
        8.         linkedHashMap.put("key3", "value3");
        9.         for (Map.Entry<String, String> entry : linkedHashMap.entrySet()) {
        10.             System.out.println(entry.getKey() + " : " + entry.getValue());
        11.         }
        12.     }
        13. }
        复制代码

    • TreeMap

      • 基于红黑树实现,会按照键的天然序次(假如键的范例实现了 Comparable 接口)大概指定的比力器序次来分列键值对,常用于须要对键举行排序查找的场景。比方,统计单词出现的频率,以单词作为键,出现次数作为值,将它们存储在 TreeMap 中,就可以按照字母序次检察单词及对应的频率。示例代码如下:               
        1. import java.util.Map;
        2. import java.util.TreeMap;
        3. public class TreeMapExample {
        4.     public static void main(String[] args) {
        5.         Map<String, Integer> treeMap = new TreeMap<>();
        6.         treeMap.put("apple", 3);
        7.         treeMap.put("banana", 5);
        8.         treeMap.put("cherry", 2);
        9.         for (Map.Entry<String, Integer> entry : treeMap.entrySet()) {
        10.             System.out.println(entry.getKey() + " : " + entry.getValue());
        11.         }
        12.     }
        13. }
        复制代码


区别总结

比力维度ListSetMap元素存储特点有序,可重复无序,不可重复以键值对情势存储,键唯一紧张用途恰当按序次存储、频仍通过索引访问元素的场景,如列表展示数据等用于确保元素唯一性的场景,比如去重、判定元素是否存在等用于通过键快速查找对应值的场景,如存储设置信息、映射关系等常见实现类的查询服从对比(大抵)ArrayList查询快(通过索引),LinkedList查询相对慢HashSet、TreeSet查询服从都较高,TreeSet还能有序输出元素HashMap查询服从高,LinkedHashMap可保持插入序次并查询,TreeMap按键排序后查询常见实现类的插入 / 删除操纵服从对比(大抵)ArrayList中心插入 / 删除慢,首尾相对好一些;LinkedList首尾插入 / 删除快HashSet插入 / 删除服从高,TreeSet在维持排序结构下插入 / 删除相对稍慢HashMap插入 / 删除服从高,LinkedHashMap类似,TreeMap在维持排序结构下插入 / 删除相对稍慢通过上述对 List、Set、Map 的详细先容和区别分析,可以根据详细的业务需求和性能要求,在 Java 编程中公道地选择和利用相应的聚集范例。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表