集合,完整扩展

目录

前言:

一、List接口

1.1 ArrayList

1.2 LinkedList

1.3 Vector

二、Set接口

2.1 HashSet

2.2 TreeSet

2.3 LinkedHashSet

三、应用选择


前言:

本篇文章重点梳理 List 接口和 Set 接口的核心内容,结合代码案例帮大家吃透它们的特点和用法。

先简单复习下 Collection 接口:它是所有单列集合的 “老祖宗”,定义了添加、删除、判断包含等通用方法,像add()、remove()、contains()这些,咱们后面讲的 List 和 Set 都能直接用。

一、List接口

------有序、可重复、带索引的 “排队队伍”

List 接口继承了 Collection,就像在 Collection 的基础上多了些 “特殊技能”。咱们记住它的三个核心特点:

--有序:元素怎么存进去,取出来还是这个顺序,比如存[1,2,3],取出来不会变成[3,1,2];
--带索引:可以通过下标(0、1、2...)直接访问元素,就像数组那样用get(index)拿值;
--可重复:同一个元素能存多次,比如list.add("a"); list.add("a");会有两个 "a"。

List接口有三种实现类:ArrayList、LinkedList、Vector。

1.1 ArrayList

------查询快、增删慢的 “数组加强版”

ArrayList 是 List 最常用的实现类,底层就是个动态数组(长度能自动变)

  • 优点:查询快!因为数组在内存中连续存储,通过索引直接定位,时间复杂度 O (1);
  • 缺点:增删慢!如果在中间插元素,后面的元素都得往后挪,比如数组[1,2,3]插个 4 到中间,就变成[1,4,2,3],2 和 3 都要移动。

代码案例:

List<String> list = new ArrayList<>();
list.add("苹果");  // 末尾加元素
list.add(1, "香蕉");  // 下标1的位置插入
System.out.println(list.get(0));  // 用索引查元素,输出“苹果”
list.remove(1);  // 删除下标1的元素

1.2 LinkedList

------增删快、查询慢的 “链表”

LinkedList 底层是双向链表,每个元素像个 “小火车车厢”,除了存数据,还带着前后 “钩子”(指针)

  • 优点:增删快!中间插元素只需改前后指针,不用移动其他元素,比如链表1->2->3插个 4,改成1->4->2->3就行;
  • 缺点:查询慢!找第 n 个元素得从第一个开始挨个往后数,时间复杂度 O (n)。

代码案例:

LinkedList<String> list = new LinkedList<>();
list.addFirst("头");  // 头部加元素
list.addLast("尾");   // 尾部加元素
System.out.println(list.getFirst());  // 取头部元素
list.removeLast();    // 删除尾部元素

1.3 Vector

------线程安全的 “老古董”

Vector 和 ArrayList 类似,也是动态数组,但它的方法大多加了synchronized(同步锁),多线程环境下用着安全。不过单线程下性能不如 ArrayList,现在基本被Collections.synchronizedList(new ArrayList<>())替代了。

二、Set接口

------无序、不可重复的 “聚宝盆”

Set 接口也是 Collection 的 “孩子”,但和 List 性格完全不同:

--无序:存的顺序和取的顺序没关系(LinkedHashSet 除外);
--无索引:不能用下标访问,只能遍历;
--不可重复:相同元素只能存一次,比如set.add("a"); set.add("a");最终只有一个 "a"。

2.1 HashSet

------用哈希表实现的 “去重小能手”

HashSet 底层是哈希表,判断元素是否重复靠两个方法:hashCode()equals()

--存元素时,先算元素的哈希值(hashCode()),找对应的 “坑位”;
--如果 “坑位” 已有元素,再用equals()比较,相同就不存,不同就 “挂” 在后面(哈希冲突处理)。

代码案例:

Set<String> set = new HashSet<>();
set.add("张三");
set.add("张三");  // 重复,添加失败
set.add(null);
set.add(null);    // 重复,只存一个null
System.out.println(set.size());  // 输出2("张三"和null)

注意:

存自定义对象(比如 Student)时,必须重写hashCode()和equals(),否则去重失效!

2.2 TreeSet

------自动排序的 “整理小助手”

TreeSet 底层是红黑树(一种排序树),元素会自动按规则排好序。

排序规则有两种:

--自然排序:元素类实现Comparable接口,重写compareTo()方法;
--比较器排序:创建 TreeSet 时传Comparator对象,自定义排序逻辑。

代码案例:

        --自然排序

// Student类实现Comparable接口
class Student implements Comparable<Student> {String name;int age;@Overridepublic int compareTo(Student o) {return this.age - o.age;  // 按年龄升序}
}Set<Student> set = new TreeSet<>();
set.add(new Student("张三", 20));
set.add(new Student("李四", 18));
// 遍历会输出:李四(18)、张三(20)(按年龄排好了)

2.3 LinkedHashSet

------有序的 “HashSet 升级版”

LinkedHashSet 是 HashSet 的子类,底层多了个链表记录插入顺序,所以既能去重,又能保证 “存啥顺序,取啥顺序”。性能比 HashSet 稍差,但在需要顺序的时候很有用。

代码案例:

Set<String> set = new LinkedHashSet<>();
set.add("b");
set.add("a");
set.add("c");
// 遍历输出:b、a、c(和插入顺序一致)

三、应用选择

有序用 List,去重用 Set;查多用 ArrayList,增删多用 LinkedList;需要排序用 TreeSet,要顺序去重用 LinkedHashSet

总结:

集合特点场景举例
ArrayList查快增删慢、有序重复存班级名单,频繁查询
LinkedList增删快查慢、有序重复实现队列 / 栈,频繁加减元素
HashSet无序去重、效率高存用户 ID,需要去重
TreeSet自动排序、去重存成绩,需要按分数排序
LinkedHashSet有序去重存操作日志,保留顺序

好了,我们今天的内容就到这里了,感谢大家的观看。

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

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

相关文章

【doris基础与进阶】3-Doris安装与部署

安装前的准备 在windows系统上通过vmwareubuntu 22.04的方式进行安装&#xff0c;由于资源有限&#xff0c;在同1台机器上同时安装fe和be&#xff08;broker本次不安装&#xff0c;极简化安装&#xff09;&#xff0c;安装版本为2.1.10&#xff0c;2.x版本架构不会有大的变化&a…

关于数据结构6-哈希表和5种排序算法

哈希表1哈希算法将数据通过哈希算法映射成一个键值&#xff0c;存取都在同一个位置实现数据的高效存储和查找&#xff0c;将时间复杂度尽可能降低至O(1)2哈希碰撞多个数据通过哈希算法得到的键值相同&#xff0c;成为产生哈希碰撞3哈希表&#xff1a;构建哈希表存放0-100之间的…

AWT与Swing深度对比:架构差异、迁移实战与性能优化

全面对比分析Java AWT与Swing GUI框架的架构差异、性能表现和适用场景&#xff0c;提供完整的AWT到Swing迁移实战指南&#xff0c;包含15代码示例、性能测试数据、最佳实践建议&#xff0c;助你做出明智的技术选型和实现平滑迁移。 Java AWT, Swing, GUI框架对比, 代码迁移, 性…

git仓库检测工具

介绍 Gitleaks 是一款用于检测git 仓库、文件以及任何你想通过 git 传递的信息(例如密码、API 密钥和令牌)的工具stdin。如果你想了解更多关于检测引擎工作原理的信息,请查看这篇博客:正则表达式(几乎)就是你所需要的一切。 ➜ ~/code(master) gitleaks git -v○│╲│…

【4】Transformers快速入门:自然语言模型 vs 统计语言模型

一句话关系总结 统计语言模型 自然语言模型的“数学基础” &#xff08;就像加减乘除是数学的基础&#xff0c;统计模型是AI学说话的基础工具&#xff09;区别对比表&#xff08;小白版&#xff09;维度统计语言模型自然语言模型本质用数学公式算句子概率用神经网络模仿人脑理…

[激光原理与应用-252]:理论 - 几何光学 - 传统透镜焦距固定,但近年出现的可变形透镜(如液态透镜、弹性膜透镜)可通过改变自身形状动态调整焦距。

一、液态透镜&#xff1a;电润湿效应驱动曲率变化基本结构液态透镜由两种互不相溶的液体&#xff08;如导电水溶液与绝缘硅油&#xff09;封装在透明圆筒形容器中构成。容器壁经疏水处理&#xff0c;使水溶液呈圆顶型聚集在中心&#xff0c;与硅油形成凸状曲面。工作原理电润湿…

wordpress数据库导入时的#1044错误

在wordpress网站数据库文件.sql导入到数据库时&#xff0c;发生错误&#xff0c;错误提示如下&#xff1a;#1044 – Access denied for user ‘wodepress_com’’localhost’ to database ‘wodepress’。 这个错误表明用户wodepress_com没有权限访问数据库wodepress。以下是解…

微服务ETCD服务注册和发现

1.什么是注册中心 注册中心主要有三种角色&#xff1a; 服务提供者&#xff08;RPC Server&#xff09;&#xff1a;在启动时&#xff0c;向 Registry 注册自身服务&#xff0c;并向 Registry 定期发送心跳汇报存活状态。 服务消费者&#xff08;RPC Client&#xff09;&…

计算机网络---默认网关(Default Gateway)

一、默认网关的定义 默认网关&#xff08;Default Gateway&#xff09;是一个网络设备&#xff08;通常是路由器、防火墙或三层交换机&#xff09;的IP地址&#xff0c;它是本地网络中的设备访问其他网络&#xff08;如外网、其他子网&#xff09;时&#xff0c;数据报文的“第…

OpenBMC中libgpio架构与驱动交互全解析:从硬件映射到应用控制

1. libgpio概述与核心定位 libgpio作为OpenBMC中GPIO管理的核心库&#xff0c;扮演着连接硬件驱动与上层应用的桥梁角色。它通过标准化的接口抽象了不同硬件平台的GPIO操作细节&#xff0c;使得电源控制、传感器监控等关键功能能够以统一的方式访问GPIO资源。 1.1 libgpio在Ope…

开放原子开源生态大会:麒麟信安加入openEuler社区AI联合工作组,聚焦操作系统开源实践与行业赋能

7月23日&#xff0c;由开放原子开源基金会主办的2025开放原子开源生态大会在京开幕&#xff0c;大会以“开源赋能产业&#xff0c;生态共筑未来”为主题。工业和信息化部副部长熊继军、北京市人民政府副秘书长许心超出席大会并致辞。作为开放原子开源基金会黄金捐赠人和开源重要…

Lyapunov与SAC算法的数学结构对比:从二次漂移到TD损失

一、李雅普诺夫优化中二次漂移函数的推导 李雅普诺夫优化的核心是通过设计 “李雅普诺夫函数” 和 “漂移项”&#xff0c;保证系统状态收敛到稳定点。以下以线性时不变系统为例&#xff08;非线性系统推导逻辑类似&#xff0c;仅动力学方程更复杂&#xff09;&#xff0c;推导…

WireShark:非常好用的网络抓包工具

文章目录一、写在前面二、安装三、使用1、入门使用&#xff08;1&#xff09;打开软件&#xff08;2&#xff09;右键网卡&#xff0c;Start Capture(开始捕获)2、界面详细介绍3、过滤器设置一、写在前面 Wireshark是使用最广泛的一款「开源抓包软件」&#xff0c;常用来检测网…

WEB技术演进史:从C/S到微服务架构

WEB技术 HTTP协议和B/S 结构 操作系统有进程子系统&#xff0c;使用多进程就可以充分利用硬件资源。进程中可以多个线程&#xff0c;每一个线程可以被CPU调度执行&#xff0c;这样就可以让程序并行的执行。这样一台主机就可以作为一个服务器为多个客户端提供计算服务。 客户端…

win11中Qt5.14.0+msvc2019+opencv4.9配置

本文主要研究由msvc编译的opencv在QT中的配置&#xff0c;opencv可以是官网直接下载的版本&#xff0c;也可以是msvc(例如vs2019)通过cmake编译 contrib功能的opencv版本&#xff0c;这2种版本对qt版本没有严格要求&#xff0c;但是若在cmake中选择了with_qt功能&#xff0c;那…

【listlist模拟】

list&list模拟1.list使用2、list模拟附录1.list使用 list常见接口不做介绍&#xff0c;跟前面vector有相似之处&#xff0c;跟数据结构list基本一样。  因为list使用带头的双向循环链表实现的&#xff0c;不能用小标访问&#xff0c;只能用迭代器或范围for访问 list有成…

在CentOS 7上将PostgreSQL数据库从默认路径迁移到自定义目录

在CentOS 7上将PostgreSQL数据库从默认路径迁移到自定义目录&#xff0c;需遵循以下步骤。假设原数据目录为“/var/lib/pgsql/12/data”&#xff0c;目标目录为“/new/path/pgdata”。 1、步骤概览 停止PostgreSQL服务创建新目录并设置权限复制数据文件&#xff08;保留权限&am…

C语言基础06——结构体(struct)

一、结构体的概念结构体&#xff08;struct&#xff09;是 C 语言中一种自定义数据类型&#xff0c;它允许你将不同类型的数据项组合在一起&#xff0c;形成一个新的复合数据类型。想象一下&#xff1a;如果要表示一个 "学生"&#xff0c;需要包含姓名&#xff08;字…

小白入门指南:Edge SCDN 轻松上手

在互联网飞速发展的当下&#xff0c;网站性能与安全至关重要。对于小白而言&#xff0c;Edge SCDN 可能是个陌生概念&#xff0c;但它却能极大助力网站运营。本文将用简单易懂的语言&#xff0c;带大家了解 Edge SCDN&#xff0c;探讨其运用方法。​一、Edge SCDN 是什么&#…

探秘酵母单杂交技术:解锁基因调控的密码

在生命科学研究领域&#xff0c;基因的表达调控机制一直是科学家们关注的焦点。为了深入探究这一复杂过程&#xff0c;众多先进技术应运而生&#xff0c;酵母单杂交技术便是其中极具价值的一项&#xff0c;它为研究 DNA 与蛋白质之间的相互作用提供了独特视角与有效手段。酵母单…