Java基础:list、set、map一遍过

Java的集合(list、set、map)非常重要,竞赛和开发经常会用到,同时也是教学和考试的重点,接下来我将介绍这三个集合的知识。

list:

可重复(允许元素重复)、有序(存取顺序一致)、单列集合、有索引(可以通过下标 get(i) 取值),他和数组的区别就是数组是开辟一块连续的内存,开辟多少最多就只能用多少,list(set、map)只可以存放引用类型(包括包装类、String、自定义对象),长度可变自动扩容。

常用实现类

  1. ArrayList(最常用)

    • 底层:动态数组
    • 查询快、增删慢
    • 线程不安全
    • 默认初始容量 10,扩容 1.5 倍
  2. LinkedList

    • 底层:双向链表
    • 增删快、查询慢
    • 适合频繁插入、删除
    • 线程不安全

List 常用方法

复制代码
list.add();//添加一个元素
list.get(index);//获取下标为index的元素
list.remove(index);//移除下标为index的元素
list.size();//获取list的大小(长度)
list.contains();//判断list是否包含某个元素

set:

无序(存取顺序不一致)、不可重复(自动去重)、无索引(不能用下标取值)、单列集合

常用实现类

  1. HashSet

    • 底层:HashMap 封装
    • 无序、去重
    • 线程不安全
    • 去重依赖:hashCode() + equals()
  2. LinkedHashSet

    • 底层:哈希表 + 双向链表
    • 保留插入顺序,又能去重
  3. TreeSet

    • 底层:红黑树
    • 自动升序排序
    • 可自定义比较器

Set 常用方法

和list类似(没有get方法)

Map 集合

双列存储 :key + value、key 唯一不可重复 ,value 可重复、无序(HashMap)

常用实现类

  1. HashMap(最常用)

    • 底层:数组 + 链表 + 红黑树
    • JDK1.8 链表长度≥8 转红黑树
    • 无序、线程不安全
    • 默认容量 16,负载因子 0.75
  2. LinkedHashMap

    • 保留插入顺序
    • 可做 LRU 缓存
  3. TreeMap

    • 底层红黑树
    • key 自动排序

Map 常用方法

复制代码
map.put(key,value);//添加元素
map.get(key);//获取key对应的value
map.remove(key);
map.containsKey(key);//是否包含某个键
map.keySet();       // 获取所有key

对比表

|------|--------|---------|-----|
| 集合 | 有序 | 可重复 | 有索引 |
| List | 有序 | 可重复 | 下标 |
| Set | 无序 | 不可重复 | 无下标 |
| Map | key 无序 | key 不重复 | 无下标 |

嵌套用法

这三个可以互相嵌套使用:

复制代码
List<List<Integer>> list = new ArrayList<>();//场景:二维表、嵌套列表、分组数据
List<Set<String>> list = new ArrayList<>();//场景:每组内部自动去重
Map<Integer, List<Water>> map = new HashMap<>();//场景:分组,比如 分类 id → 对应多条数据

排序

Map和Set不能直接排序,可以先转为List再进行排序

复制代码
// 升序
Collections.sort(list);
// 或
list.sort(Comparator.naturalOrder());


//降序
list.sort(Comparator.reverseOrder());




//自定义对象排序(重点)
class Person{
    public String name;
    public int age;
}

// 按年龄升序
list.sort((u1,u2) -> u1.age - u2.age);

// 按年龄降序
list.sort((u1,u2) -> u2.age - u1.age);
//升序就是前减后,降序是后减前

//自定义排序(重写compare)
//返回 负数:o1 放前面
//返回 正数:o2 放前面
//返回 0:顺序不变


List<Person> list = new ArrayList<>();
list.add(new Person("张三", 20));
list.add(new Person("李四", 18));
list.add(new Person("王五", 25));

Collections.sort(list, new Comparator<Person>() {
    @Override
    public int compare(Person o1, Person o2) {
        // 升序:o1.age - o2.age
        return o1.getAge() - o2.getAge();
        //这里可自定义排序方法
    }
});
相关推荐
2601_961194028 小时前
考研资料电子版|去哪找|网盘
java·c语言·c++·python·考研·php
于先生吖8 小时前
前后端分离二手商城开发,质检登记、回收回款整套业务源码部署教程
java·开发语言·uni-app
codeejun8 小时前
每日一Go-76(架构篇)|多集群部署 / 容灾 / Failover / Backup / 热迁移
开发语言·架构·golang
战族狼魂8 小时前
从零构建企业级Hermes-Agent:复杂任务拆解、工具协同与安全落地实践
开发语言·人工智能·python
小锋java12349 小时前
分享一套锋哥原创的基于LangChain4j的RAG医疗健康知识智能问答系统(SpringBoot4+Vue3+Ollama)
java·人工智能
阿里嘎多学长9 小时前
2026-06-08 GitHub 热点项目精选
开发语言·程序员·github·代码托管
程序员晨曦9 小时前
Java 并发修仙传:ThreadLocal 从“闭关修炼”到“走火入魔”的救赎之路
java·开发语言
AIGS0019 小时前
探索向量空间JBoltAI:工业企业数智化升级的基础设施
java·人工智能·人工智能ai大模型应用
李可以量化9 小时前
量化之MiniQMT 实战:一键读取通达信自选股并实时监控涨跌幅(附完整可运行代码)
开发语言·python·量化·qmt·ptrade
嘶哈哈哈9 小时前
嘉立创 EDA 入门实操笔记:从原理图到 PCB 布线、差分对、覆铜与 DRC 检查
开发语言·笔记·php