Java集合 - 教程

news/2025/9/23 15:19:59/文章来源:https://www.cnblogs.com/yfceshi/p/19107271

集合的定义

Java 集合是用于存储、操作和管理多个对象的容器框架,它封装并实现了各种常见的数据结构(如数组、链表、哈希表、树等),提供了统一的接口和丰富的操作方法,简化了数据的处理过程。
与数组相比,集合具有动态扩容、类型多样、操作便捷等特点,是 Java 编程中处理多元素数据的核心工具。

集合体系关系图(简化)

在这里插入图片描述

HashMap、HashSet

数据结构

HashMap:基于哈希表(数组 + 链表 / 红黑树)实现。数组称为哈希桶,每个桶中存储键值对节点。当链表长度超过阈值(默认 8)时,会转换为红黑树以提高查询效率;当红黑树节点数少于 6 时,会退化为链表。
HashSet:底层基于 HashMap 实现,其存储的元素作为 HashMap 的 key,而 value 是一个固定的 Object 对象(PRESENT)。因此 HashSet 的特性完全由 HashMap 决定。

扩容机制

HashMap:
初始容量默认为 16,负载因子默认为 0.75。当元素数量超过容量 × 负载因子时,会触发扩容。
扩容时,新容量为原容量的 2 倍,然后重新计算所有元素的哈希值并迁移到新的哈希桶中(重新哈希)。
JDK 1.8 中优化了扩容时的元素迁移方式,通过高低位运算减少重新计算哈希的开销。
HashSet:由于底层依赖 HashMap,其扩容机制与 HashMap 一致,跟随底层 HashMap 的扩容而扩容。

检索与插入元素

HashMap:
插入:计算 key 的哈希值,通过哈希值确定存储的桶位置。若桶中已有元素,通过 equals 方法判断是否为相同 key,若相同则替换 value(key 覆盖);否则插入链表或红黑树中。
检索:根据 key 的哈希值找到对应的桶,然后遍历链表或红黑树,通过 equals 方法匹配 key 以获取 value。
HashSet:
插入:添加元素时,将元素作为 key 存入底层 HashMap,value 为固定对象。若元素已存在(通过 hashCode 和 equals 判断),则不插入(不会发生覆盖,因为 add 方法会返回 false)。
检索:判断元素是否存在时,实际是判断底层 HashMap 中是否存在该 key。
时间复杂度
HashMap:
理想情况下(哈希分布均匀),插入、删除、查询操作的时间复杂度均为 O (1)。
最坏情况下(哈希冲突严重,链表过长),时间复杂度会退化到 O (n);但转为红黑树后,最坏情况时间复杂度为 O (log n)。
HashSet:由于依赖 HashMap,其添加、删除、查询操作的时间复杂度与 HashMap 一致,同样为 O (1)(理想情况)或 O (log n)(红黑树情况下)。

TreeMap、TreeSet

数据结构

TreeMap:基于红黑树(一种自平衡的二叉搜索树)实现。红黑树的节点按照 key 的自然顺序或自定义比较器的顺序进行排序,保证了元素的有序性。
TreeSet:底层基于 TreeMap 实现,存储的元素作为 TreeMap 的 key,value 是一个固定的 Object 对象(PRESENT)。因此 TreeSet 是有序集合,排序规则与 TreeMap 一致。

扩容机制

TreeMap:红黑树结构没有固定的容量概念,无需像哈希表那样进行扩容。当元素数量增加时,红黑树会通过旋转等操作保持平衡,以维持良好的性能。
TreeSet:由于底层依赖 TreeMap,同样不存在扩容机制,元素的增减通过红黑树的插入和删除操作实现,树结构会自动平衡。

检索与插入元素

TreeMap:
插入:根据 key 的排序规则(自然顺序或比较器)将节点插入红黑树中,插入后会通过旋转和变色操作维持红黑树的平衡。若 key 已存在(通过比较器判断),则会替换其 value(key 覆盖)。
检索:利用二叉搜索树的特性,从根节点开始比较 key,小于当前节点则向左子树查找,大于则向右子树查找,直到找到匹配节点或到达叶子节点。
TreeSet:
插入:添加元素时,将元素作为 key 存入底层 TreeMap,value 为固定对象。若元素已存在(通过比较器判断),则不插入(不会发生覆盖)。
检索:判断元素是否存在时,实际是在底层 TreeMap 的红黑树中进行查找,遵循二叉搜索树的检索逻辑。
时间复杂度
TreeMap:插入、删除、查询操作的时间复杂度均为 O (log n),这是因为红黑树的高度始终保持在 log n 级别(n 为元素数量)。
TreeSet:由于依赖 TreeMap,其添加、删除、查询操作的时间复杂度与 TreeMap 一致,均为 O (log n)。

代码演示

下面通过 Student 类作为 key 来演示这四个集合的使用,Student 类包含 age 和 name 属性,并重写了 equals、hashCode 方法,实现了 Comparable 接口按 age 排序。
Student 类定义

import java.util.Objects;
// Student类实现Comparable接口,按age排序
public class Student
implements Comparable<
Student> {
private int age;
private String name;
public Student(int age, String name) {
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public String getName() {
return name;
}
@Override
public String toString() {
return "Student{age=" + age + ", name='" + name + "'}";
}
// 重写equals方法,age和name都相同才认为是同一个对象
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age &&
Objects.equals(name, student.name);
}
// 重写hashCode方法,与equals保持一致
@Override
public int hashCode() {
return Objects.hash(age, name);
}
// 实现Comparable接口,按age升序排序
@Override
public int compareTo(Student o) {
return Integer.compare(this.age, o.age);
}
}

集合使用演示

import java.util.*;
public class CollectionDemo
{
public static void main(String[] args) {
// 创建测试用的Student对象
Student s1 = new Student(20, "Alice");
Student s2 = new Student(22, "Bob");
Student s3 = new Student(21, "Charlie");
Student s4 = new Student(20, "Alice");
// 与s1是同一个对象(equals返回true)
Student s5 = new Student(23, "David");
Student s6 = new Student(23,"java");
System.out.println("=== HashMap 演示 ===");
HashMap<
Student, String> hashMap = new HashMap<
>();
hashMap.put(s1, "大一");
hashMap.put(s2, "大三");
hashMap.put(s3, "大二");
// 插入s4,与s1是同一个key,会覆盖value
hashMap.put(s4, "大一(重读)");
// 遍历HashMap
for (Map.Entry<
Student, String> entry : hashMap.entrySet()) {
System.out.println(entry.getKey() + " -> " + entry.getValue());
}
System.out.println("\n=== HashSet 演示 ===");
HashSet<
Student> hashSet = new HashSet<
>();
hashSet.add(s1);
hashSet.add(s2);
hashSet.add(s3);
// 插入s4,与s1重复,不会被添加
boolean added = hashSet.add(s4);
System.out.println("s4是否被添加到HashSet: " + added);
// 输出false
// 遍历HashSet
for (Student student : hashSet) {
System.out.println(student);
}
System.out.println("\n=== TreeMap 演示 ===");
TreeMap<
Student, String> treeMap = new TreeMap<
>();
treeMap.put(s1, "大一");
treeMap.put(s2, "大三");
treeMap.put(s3, "大二");
// 插入s4,与s1是同一个age,会保留原来的值,与hashmap相反
treeMap.put(s4, "大一(重读)");
treeMap.put(s5, "大四");
treeMap.put(s6,"大五");
//s5中的age与s6相等,会保留s5
// 遍历TreeMap,会按age升序排列
for (Map.Entry<
Student, String> entry : treeMap.entrySet()) {
System.out.println(entry.getKey() + " -> " + entry.getValue());
}
System.out.println("\n=== TreeSet 演示 ===");
TreeSet<
Student> treeSet = new TreeSet<
>();
treeSet.add(s1);
treeSet.add(s2);
treeSet.add(s3);
// 插入s4,与s1重复,s4不会被添加
added = treeSet.add(s4);
System.out.println("s4是否被添加到TreeSet: " + added);
// 输出false
treeSet.add(s5);
treeSet.add(s6);
// 插入s5,与s6重复,s6不会被加
// 遍历TreeSet,会按age升序排列
for (Student student : treeSet) {
System.out.println(student);
}
}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/912965.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用前端(HTML+Node.js)实现物品借用登记:完整代码示例

在日常工作中,经常需要借用各种办公或实验设备、工具及耗材。为了方便管理借用记录、防止物品丢失,同时提高办公效率,我设计了一个前端小程序——物品借用登记系统。该系统支持记录借用人、物品名称、数量、借用说明…

Google智能体Jules小试牛刀

Google智能体Jules小试牛刀Jules 能做什么Google 的 Jules 是一个编程相关的 AI 助手(coding agent),它可以在背景中异步地处理各种代码任务,让开发者腾出时间专注于更重要/更有创意的工作。 处理各种编码任务 Ju…

免费浏览的网站完全静态化成wordpress

一、Ken Burns特效 当使用OpenCV时,最常使用的是图像,但是我们也可以多个图像创建动画,通过引入时间轴更容易可视化。 Ken Burns特效这是一种以电影制片人肯伯恩斯 (Ken Burns) 命名的平移和缩放技术,Ken Burns 效果不是在屏幕上显示大型静态照片,而是裁剪细节,然后平移图…

泰安网站制作哪家好wordpress 建站教程

日志记录是软件开发中不可或缺的功能&#xff0c;它能帮助开发者在应用程序运行时记录重要信息&#xff0c;便于调试和监控。本文将详细介绍C#中的常用日志记录功能以及常用的日志库&#xff0c;包括日志级别控制、日志输出格式、自定义日志目标、结构化日志和异步日志记录。同…

深圳网站设计公司哪家好境外注册网站

根据现实需要&#xff0c;此系统我们设计出一下功能&#xff0c;主要有以下功能模板。 &#xff08;1&#xff09;新闻发布系统前台&#xff1a;首页、时事新闻、公告资讯、个人中心。 &#xff08;2&#xff09;管理员功能&#xff1a;首页、个人中心、用户管理、新闻分类管理…

wordpress第一个版本学seo可以做网站吗

目录 MySQL数据库提权简介 UDF提权 原理 利用条件 利用准备 利用过程 MOF提权 原理 利用条件 利用过程 自启动提权 反弹shell提权 总结 MySQL数据库提权简介 一般数据库提权思路&#xff1a; 检测数据库的存在&#xff08;探测端口&#xff09;获取到数据库的权限…

网站怎么做首页比较好燕郊seo

docker基本命令是一个开源的应用容器引擎&#xff1b;是一个轻量级容器技术&#xff1b;docker主机(Host)&#xff1a;安装了Docker程序的机器&#xff08;Docker直接安装在操作系统之上&#xff09;&#xff1b;docker客户端(Client)&#xff1a;连接docker主机进行操作&#…

外包做网站一般多少钱wordpress中文标题转换拼音插件

用户管理 一个用户必须有一个主组一个用户可以拥有多个组 但是必须一个主组 其它组是临时组一个组可以拥有多个用户用户的信息放到 /etc/passwd 用户的密码 存入 /etc/shadow 组信息存到 /etc/group添加用户 add useradd shengliang 这时候会在 /etc/passwd 下生成一条记录 she…

珠宝行业网站建设生活馆网站开发背景

目录 1.定时任务实现 2.quartz说明 3.存储方式 4.示例 5.定时任务的重新定制&#xff0c;恢复&#xff0c;暂停及删除 1.定时任务实现 定时任务的实现方式有很多&#xff0c;如下&#xff1a; 1.启动类中添加EnableScheduling&#xff0c;开启定时任务功能&#xff0c;然…

搞笑椅子机房语录

抽象2025.9.23 (已知院长同学很爱唱“我要当主席”,此时正在唱校歌) 47:咋都开始唱校歌了 院长:我都当主席了还不能唱校歌了? 珂乌:还是当主席吧

在AI技术快速实现创意的时代,挖掘渗透测试框架新需求成为关键挑战

该篇文章无摘要a.内容描述核心功能定位:该项目是一个可扩展的后渗透测试和对抗仿真框架,采用服务器/客户端架构设计,主要面向专业渗透测试人员。服务器端采用Golang开发,客户端采用C++ QT框架实现跨平台支持。关键…

基于区域的空间域图像融合MATLAB实现

基于区域的空间域图像融合MATLAB实现,结合多尺度区域分割与特征加权策略一、方法原理区域分割 采用SLIC超像素分割算法将图像划分为均匀区域,每个区域包含约200-300个像素。 区域特征提取颜色特征:HSV空间均值 纹理…

网站seo自己怎么做什么是关键词

前言 对象图和包图依然是对系统的静态的描写叙述。UML九种图加上包图&#xff0c;事实上是十幅图。 包图 1.构成 2.包中的元素 类、接口、用例、构件、其他包等。&#xff08;若包被撤销&#xff0c;当中的元素被撤销&#xff09; 3.包之间的关系 泛化、细化、依赖&#xff08;…

甘肃建设职工教育培训中心网站计算机网络设计是干什么的工作

文章目录 前言一、安装cudn二、安装cudnn三、安装pytorch 前言 确保Windows系统版本高于windows10 21H2或Windows11&#xff0c;然后在Windows中将显卡驱动升级到最新即可&#xff0c;WSL2已支持对显卡的直接调用。 一、安装cudn 进入英伟达官网中的cuda下载地址&#xff1…

怎么建造网站天津网站建设品牌推广

微软2024年1月的更新补丁正常更新会出现0x80070643错误&#xff0c;原因是正常安装系统默认的恢复分区留小了&#xff0c;通过压缩系统盘空间然后在diskgenius扩容恢复分区空间可以解决这个问题&#xff0c;但是笔者在进行上述操作时依旧出现了报错&#xff0c;按照网上的说法可…

intitle:律师网站建设的重要性做网站公司怎么样

为什么80%的码农都做不了架构师&#xff1f;>>> ##Win10除了Edge/IE&#xff0c;其他浏览器打开和载入速度都很慢 解决办法&#xff1a;以管理员身份运行cmd&#xff0c;输入netsh winsock reset重置winsock&#xff0c;然后重启电脑即可 转载于:https://my.oschin…

广州建设网站公司哪个济南兴田德润有活动吗做网站的图片=gif

Ajax-05 xhr&#xff08;level-2&#xff09;新特性 responseType属性和response属性 responseType: 表示预期服务器返回的数据的类型 “” &#xff0c;默认空text&#xff0c;和空一样&#xff0c;表示服务器返回的数据是字符串格式json&#xff0c;表示服务器返回的是js…

网站登录 效果代码产品软文范例500字

如果没有正确的工具来汇总和解析日志数据&#xff0c;则几乎不可能找到并了解您正在寻找的信息。 日志有无穷无尽的用途&#xff0c;因为日志本身是无止境的。 应用程序日志&#xff0c;安全日志&#xff0c;BI日志&#xff0c; 林肯日志 &#xff08;好吧&#xff0c;也许不是…

网站留白做301网站打不开

所有的NLP大模型 都是transformer结构 1.Mask attention 的策略不同 2.训练任务目标不同 国内大模型nb公司&#xff1a;百度、清华智谱 一、主流大模型 粉色&#xff1a;Encoder-only。 绿色&#xff1a;Encoder-Decoder&#xff0c;尽头智谱ChatGLM。 蓝色&#xff1a;…