List、Set、Map详解和区别

在 Java 中,ListSetMap是常用的集合类型,它们各自具有不同的特点和用途,以下是对它们的详细介绍及区别分析:

List(列表)

  • 特点
    • 有序性List中的元素是有序的,即元素的存入顺序和取出顺序是一致的。例如,先存入元素 A,再存入元素 B,那么按照顺序取出时,会先得到 A,然后是 B
    • 可重复性:允许存储重复的元素。可以在同一个 List 中多次添加相同的对象。
    • 元素可通过索引访问:能够通过索引(下标)来获取、修改或删除元素,索引从 0 开始,就像操作数组一样方便。例如,可以使用 list.get(0) 获取列表中的第一个元素。
  • 常见实现类及用法
    • ArrayList
      • 内部基于数组实现,查询效率高,因为可以通过数组下标直接定位元素。例如,在一个存储大量学生信息的 ArrayList 中查找某个学生的信息,通过索引访问速度很快。
      • 但是在进行频繁的插入和删除操作(尤其是在列表中间位置操作)时,效率相对较低,因为需要移动后续元素来保证顺序和连续性。示例代码如下:
        import java.util.ArrayList;
        import java.util.List;
        
        public class ArrayListExample {
            public static void main(String[] args) {
                List<String> arrayList = new ArrayList<>();
                arrayList.add("Apple");
                arrayList.add("Banana");
                arrayList.add("Apple");  // 允许重复添加
        
                System.out.println(arrayList.get(0));  // 通过索引获取元素
        
                arrayList.remove(1);  // 删除指定索引位置的元素
            }
        }
    • LinkedList
      • 内部基于链表结构实现,在进行插入和删除操作时效率较高,尤其是在链表的首尾位置进行操作。例如,在实现一个队列或者栈的数据结构时,使用 LinkedList 会很方便。
      • 不过,查询效率相对 ArrayList 较低,因为要遍历链表节点来查找元素。示例代码如下:
        import java.util.LinkedList;
        import java.util.List;
        
        public class LinkedListExample {
            public static void main(String[] args) {
                List<String> linkedList = new LinkedList<>();
                linkedList.add("Dog");
                linkedList.add("Cat");
        
                linkedList.addFirst("Bird");  // 在链表头部添加元素
                linkedList.addLast("Fish");  // 在链表尾部添加元素
        
                System.out.println(linkedList.get(0));  // 通过索引获取元素
            }
        }

Set(集合)

  • 特点
    • 无序性:元素在 Set 中是没有特定顺序的,每次遍历元素的顺序可能都不一样,不同的实现类具体的存储顺序规则也不同。
    • 不可重复性:不允许存在重复的元素,即如果尝试添加一个已经在集合中的元素,添加操作将不会生效。
  • 常见实现类及用法
    • HashSet
      • 基于哈希表实现,添加、删除和查询操作的效率通常都比较高。它通过计算元素的哈希值来确定元素在集合中的存储位置,当两个元素的哈希值相同时,会进一步通过 equals 方法来判断是否为同一个元素。例如,存储一组学生的学号,用 HashSet 可以保证学号不会重复。示例代码如下:
        import java.util.HashSet;
        import java.util.Set;
        
        public class HashSetExample {
            public static void main(String[] args) {
                Set<String> hashSet = new HashSet<>();
                hashSet.add("Red");
                hashSet.add("Blue");
                hashSet.add("Red");  // 重复元素不会被添加
        
                System.out.println(hashSet.contains("Blue"));  // 检查元素是否存在
            }
        }
    • TreeSet
      • 基于红黑树实现,元素会按照自然顺序(如果元素类实现了 Comparable 接口)或者指定的比较器顺序进行排序存储,同时保证元素的不可重复性。例如,存储一组整数并希望它们自动按从小到大的顺序排列,就可以使用 TreeSet。示例代码如下:
        import java.util.Set;
        import java.util.TreeSet;
        
        public class TreeSetExample {
            public static void main(String[] args) {
                Set<Integer> treeSet = new TreeSet<>();
                treeSet.add(5);
                treeSet.add(3);
                treeSet.add(7);
        
                for (Integer num : treeSet) {
                    System.out.println(num);  // 元素按顺序输出
                }
            }
        }

Map(映射)

  • 特点
    • 存储键值对Map 是一种用于存储键(Key)和值(Value)的集合,每个键对应一个唯一的值,通过键可以快速查找、获取对应的的值。
    • 键的唯一性:键在同一个 Map 中是不允许重复的,如果添加重复的键,后面添加的值会覆盖前面的值。
    • 无序性(一般情况):大部分常见的 Map 实现类,如 HashMap,元素的存储顺序是不固定的,不过也有一些有序的 Map 实现类,比如 LinkedHashMap 可以保持插入顺序,TreeMap 可以按照键的顺序存储元素。
  • 常见实现类及用法
    • HashMap
      • 基于哈希表实现,提供了高效的键值对存储和检索功能,是最常用的 Map 实现类。例如,在一个学生信息管理系统中,可以用学生的学号作为键,学生对象(包含姓名、成绩等信息)作为值,方便地进行信息查询和更新。示例代码如下:
        import java.util.HashMap;
        import java.util.Map;
        
        public class HashMapExample {
                public static void main(String[] args) {
                        Map<String, String> hashMap = new HashMap<>();
                        hashMap.put("name", "Alice");
                        hashMap.put("age", "20");
        
                        System.out.println(hashMap.get("name"));  // 通过键获取值
        
                        hashMap.put("name", "Bob");  // 覆盖之前键为"name"的值
                }
        }
    • LinkedHashMap
      • 继承自 HashMap,在保持了 HashMap 的高效性能的同时,还能按照插入顺序来记录键值对,方便在需要保留操作顺序的场景中使用。例如,记录用户操作的历史记录,以操作的时间戳作为键,操作详情作为值,按照操作发生的先后顺序存储在 LinkedHashMap 中。示例代码如下:
        import java.util.LinkedHashMap;
        import java.util.Map;
        
        public class LinkedHashMapExample {
            public static void main(String[] args) {
                Map<String, String> linkedHashMap = new LinkedHashMap<>();
                linkedHashMap.put("key1", "value1");
                linkedHashMap.put("key2", "value2");
                linkedHashMap.put("key3", "value3");
        
                for (Map.Entry<String, String> entry : linkedHashMap.entrySet()) {
                    System.out.println(entry.getKey() + " : " + entry.getValue());
                }
            }
        }
    • TreeMap
      • 基于红黑树实现,会按照键的自然顺序(如果键的类型实现了 Comparable 接口)或者指定的比较器顺序来排列键值对,常用于需要对键进行排序查找的场景。例如,统计单词出现的频率,以单词作为键,出现次数作为值,将它们存储在 TreeMap 中,就可以按照字母顺序查看单词及对应的频率。示例代码如下:
        import java.util.Map;
        import java.util.TreeMap;
        
        public class TreeMapExample {
            public static void main(String[] args) {
                Map<String, Integer> treeMap = new TreeMap<>();
                treeMap.put("apple", 3);
                treeMap.put("banana", 5);
                treeMap.put("cherry", 2);
        
                for (Map.Entry<String, Integer> entry : treeMap.entrySet()) {
                    System.out.println(entry.getKey() + " : " + entry.getValue());
                }
            }
        }

区别总结

比较维度ListSetMap
元素存储特点有序,可重复无序,不可重复以键值对形式存储,键唯一
主要用途适合按顺序存储、频繁通过索引访问元素的场景,如列表展示数据等用于确保元素唯一性的场景,比如去重、判断元素是否存在等用于通过键快速查找对应值的场景,如存储配置信息、映射关系等
常见实现类的查询效率对比(大致)ArrayList查询快(通过索引),LinkedList查询相对慢HashSetTreeSet查询效率都较高,TreeSet还能有序输出元素HashMap查询效率高,LinkedHashMap可保持插入顺序并查询,TreeMap按键排序后查询
常见实现类的插入 / 删除操作效率对比(大致)ArrayList中间插入 / 删除慢,首尾相对好一些;LinkedList首尾插入 / 删除快HashSet插入 / 删除效率高,TreeSet在维持排序结构下插入 / 删除相对稍慢HashMap插入 / 删除效率高,LinkedHashMap类似,TreeMap在维持排序结构下插入 / 删除相对稍慢

通过上述对 ListSetMap 的详细介绍和区别分析,可以根据具体的业务需求和性能要求,在 Java 编程中合理地选择和使用相应的集合类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值