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

Java集合框架详解:List、Set、Map及其实现类

一、集合框架概述​

Java集合框架提供了一套统一的接口和类,用于存储和操作数据。核心接口包括:

  • ​List​​:有序、可重复的集合。
  • ​Set​​:无序、不可重复的集合。
  • ​Map​​:键值对(Key-Value)映射。

​二、List接口​

List 是有序集合,允许重复元素,可以通过索引访问元素。

​1. ArrayList​
  • ​底层数据结构​​:动态数组。
  • ​特点​​:
    • 支持快速随机访问(时间复杂度 O(1))。
    • 插入和删除元素时可能需要移动数据(时间复杂度 O(n))。
  • ​示例​​:
     

    java

    复制

    import java.util.ArrayList;public class ArrayListDemo {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("Apple");list.add("Banana");list.add(1, "Orange"); // 在索引1处插入System.out.println(list.get(1)); // 输出:Orange(随机访问)list.remove(0); // 删除索引0的元素System.out.println(list); // 输出:[Orange, Banana]}
    }
​2. LinkedList​
  • ​底层数据结构​​:双向链表。
  • ​特点​​:
    • 插入和删除元素高效(时间复杂度 O(1))。
    • 随机访问效率低(需遍历链表,时间复杂度 O(n))。
  • ​示例​​:
     

    java

    复制

    import java.util.LinkedList;public class LinkedListDemo {public static void main(String[] args) {LinkedList<String> list = new LinkedList<>();list.add("A");list.addFirst("Start"); // 头部插入list.addLast("End");    // 尾部插入System.out.println(list.getFirst()); // 输出:StartSystem.out.println(list.removeLast()); // 输出:End}
    }
​3. List对比​
​特性​​ArrayList​​LinkedList​
​底层结构​动态数组双向链表
​随机访问​高效(O(1))低效(O(n))
​插入/删除​需移动数据(O(n))高效(O(1))
​适用场景​频繁查询、尾部操作频繁插入/删除

​三、Set接口​

Set 是无序集合,不允许重复元素。

​1. HashSet​
  • ​底层数据结构​​:哈希表(基于 HashMap)。
  • ​特点​​:
    • 元素无序。
    • 允许存储 null 值。
    • 插入、删除、查询时间复杂度 O(1)。
  • ​示例​​:
     

    java

    复制

    import java.util.HashSet;public class HashSetDemo {public static void main(String[] args) {HashSet<String> set = new HashSet<>();set.add("Apple");set.add("Apple"); // 重复元素,不会被添加set.add("Banana");System.out.println(set.contains("Apple")); // 输出:trueSystem.out.println(set); // 输出:[Apple, Banana](顺序不确定)}
    }
​2. TreeSet​
  • ​底层数据结构​​:红黑树(基于 TreeMap)。
  • ​特点​​:
    • 元素按自然顺序或自定义 Comparator 排序。
    • 插入、删除、查询时间复杂度 O(log n)。
  • ​示例​​:
     

    java

    复制

    import java.util.TreeSet;public class TreeSetDemo {public static void main(String[] args) {TreeSet<Integer> set = new TreeSet<>();set.add(3);set.add(1);set.add(2);System.out.println(set.first()); // 输出:1(按升序排列)System.out.println(set); // 输出:[1, 2, 3]}
    }
​3. Set对比​
​特性​​HashSet​​TreeSet​
​底层结构​哈希表红黑树
​元素顺序​无序自然顺序或自定义排序
​性能​O(1)O(log n)
​允许 null​否(会抛异常)
​适用场景​快速去重、无序需求需要排序的场景

​四、Map接口​

Map 存储键值对(Key-Value),键不可重复。

​1. HashMap​
  • ​底层数据结构​​:哈希表(数组 + 链表/红黑树)。
  • ​特点​​:
    • 键值对无序。
    • 插入、删除、查询时间复杂度 O(1)。
    • 允许一个 null 键和多个 null 值。
  • ​示例​​:
     

    java

    复制

    import java.util.HashMap;public class HashMapDemo {public static void main(String[] args) {HashMap<String, Integer> map = new HashMap<>();map.put("Alice", 90);map.put("Bob", 85);map.put("Alice", 95); // 覆盖原有值System.out.println(map.get("Alice")); // 输出:95System.out.println(map.containsKey("Bob")); // 输出:true}
    }
​2. TreeMap​
  • ​底层数据结构​​:红黑树(基于 NavigableMap)。
  • ​特点​​:
    • 键按自然顺序或自定义 Comparator 排序。
    • 插入、删除、查询时间复杂度 O(log n)。
  • ​示例​​:
     

    java

    复制

    import java.util.TreeMap;public class TreeMapDemo {public static void main(String[] args) {TreeMap<String, Integer> map = new TreeMap<>();map.put("Zebra", 1);map.put("Apple", 2);map.put("Cat", 3);System.out.println(map.firstKey()); // 输出:Apple(按升序排列)System.out.println(map); // 输出:{Apple=2, Cat=3, Zebra=1}}
    }
​3. Map对比​
​特性​​HashMap​​TreeMap​
​底层结构​哈希表红黑树
​键顺序​无序自然顺序或自定义排序
​性能​O(1)O(log n)
​允许 null 键​
​适用场景​快速查找、无序需求需要排序的键值对

​五、综合示例​
 

java

复制

import java.util.*;public class CollectionDemo {public static void main(String[] args) {// List示例List<String> arrayList = new ArrayList<>();arrayList.add("A");arrayList.add("B");System.out.println("ArrayList: " + arrayList); // [A, B]// Set示例Set<Integer> hashSet = new HashSet<>();hashSet.add(3);hashSet.add(1);hashSet.add(2);System.out.println("HashSet: " + hashSet); // [1, 2, 3](顺序不确定)// Map示例Map<String, String> hashMap = new HashMap<>();hashMap.put("Key1", "Value1");hashMap.put("Key2", "Value2");System.out.println("HashMap: " + hashMap); // {Key1=Value1, Key2=Value2}}
}

​六、总结​
​集合类型​​实现类​​特点​​适用场景​
​List​ArrayList快速随机访问,尾部操作高效频繁查询、按索引操作
LinkedList插入/删除高效,支持双向遍历频繁插入/删除、链表操作
​Set​HashSet无序,快速查找数据去重、无需顺序
TreeSet有序,支持范围查询需要排序的去重场景
​Map​HashMap键值对无序,快速查找键值映射、高频查询
TreeMap键有序,支持范围操作需要排序的键值对

通过合理选择集合类,可以显著提升代码效率和可维护性!

http://www.xdnf.cn/news/9236.html

相关文章:

  • 电子信息科学与技术专业生涯规划书-嵌入式方向(大一下)
  • 《计算机组成原理》第 3 章 - 系统总线
  • 微服务难题?Nacos服务发现来救场
  • 向量数据库对比和选择:Pinecone、Chroma、FAISS、Milvus、Weaviate
  • sqli-第三十二关——bypass addslashes
  • 使用redis代替session的登录校验
  • 企业微信内部网页开发流程笔记
  • [Java恶补day8] 3. 无重复字符的最长子串
  • 一起学数据结构和算法(三)| 字符串(线性结构)
  • 零基础远程连接课题组Linux服务器,安装anaconda,配置python环境(换源),在服务器上运行python代码【1/3 适合小白,步骤详细!!!】
  • 在 Vue 2中使用 dhtmlxGantt 7.1.13组件,并解决使用时遇到的问题汇总.“dhtmlx-gantt“: “^7.1.13“,
  • Linux中Java开发、部署和运维常用命令
  • uni-app学习笔记十五-vue3页面生命周期(一)
  • unity实现wasd键控制汽车漫游
  • 国产三维CAD皇冠CAD(CrownCAD)建模教程:汽车电池
  • 洛谷 P3372 【模板】线段树 1
  • android 输入系统
  • 不同电脑同一个网络ip地址一样吗
  • 打卡第38天
  • 数据透视:水安 B 证如何影响水利企业的生存指数?
  • Java爬虫,获取未来40天预测气象并写入Excel
  • 制作一款打飞机游戏58:子弹模式组合
  • 低空经济数据湖架构设计方案
  • 在springboot,禁止查询数据库种的某字段
  • 【linux篇】动静态库和自动化构建的“神之一手”:make、Makefile
  • AtCoder 第407场初级竞赛 A~E题解
  • java helloWord java程序运行机制 用idea创建一个java项目 标识符 关键字 数据类型 字节
  • 服务器中分布式存储数据技术都包含哪些内容?
  • maven 最短路径依赖优先
  • Qt QPaintEvent绘图事件painter使用指南