JavaSet集合

无序(指的是添加顺序和获取出的数据顺序不一致,不重复,无索引

既然Set没有索引,因此功能同上一篇Connection的功能,几乎没有额外的功能

HashSet的原理

为什么是无序(要构建红黑树),不重复,无索引

哈希值:int类型的随机值。每个对象都有自己的hash值


我们不希望哈希表挂的元素太多,那样链表查询很慢(图中左边挂)

因此当数据总数(包括挂的)超过12(16乘0.75)的时候,会发生扩容,每次扩容成原来的两倍,并重新把元素放到新的(32长度)中。

JDK8开始,当链表长度超过8,且底层数组长度大于等于64,自动将链表转成红黑树

自定义对象去重复

打印出的还是张三,并不是我们想象的无重复,去掉多余的张三和李四,这是因为他们的哈希值不一样,在建立哈希表的时候自然被散开了。

解决:在学生类中重写

1.先令哈希值相同

2.重写equals,以此在建立链表的时候判断出相同。

LinkedHashSet的原理

依然基于哈希表,数组,链表

在前面HashSet的基础上面给每个元素增加了记录前一个元素地址和后一个元素地址的指针。

因此比上面增加了有序的功能。但是同时也比较占内存。

TreeSet

底层基于红黑树实现排序,增删改查性能好。

TreeSet一定要排序,如果不给排序规则,它会崩掉。

1.对象实现Comparable

这种比较安全

如果不想去重,那么我们可以当相等的时候,我们可以随便认为其中的一个大,最后一行return 0写成return 1或者-1

也可以这样只写一行,

默认升序排列,如果想要倒序,那么return o.getAge()-this.getAge();

2.集合new的时候重写compare函数

注意当两种方案都使用的时候,打印优先用第二种集合的方法

Salary为小数,因此如果差为零点4,强转后为0,所以上述return那行有风险。因此我们调用

也可以用Lambda简化

理论上,

实际开发中,ArrayList和HashSet用的比较多

相关推荐
anew___1 小时前
《从零手写操作系统 (11):文件系统初探——initrd与VFS抽象层》
java·javascript·算法
天天向上2911 小时前
Spring AI 实战:14 个踩坑记录,其中一个让我的测试全绿但产品是坏的
java·开源
正在走向自律1 小时前
从只写接口到独立交付前后端,飞算JavaAI能给Java后端工程师多少溢价?
java·springboot·ai编程·全栈开发·java求职·飞算javaai·金九银十
a努力。2 小时前
LangChain Agent消息链路全解析
java·前端·javascript
SL_staff2 小时前
物模型是设备的数字身份证:属性、事件、服务如何决定IoT系统扩展性
java·物联网·全栈
资深技术分享员2 小时前
Geejing WebBuilder 日志、在线用户、系统监控,出问题时的三个第一现场
java·运维·数据库
卓怡学长2 小时前
w202springboot基于B_S架构的图书信息管理系统
java·spring boot·spring·intellij-idea
走到天涯海角2 小时前
用springBoot写几个简单的接口
java·spring boot·intellij-idea
troy1282 小时前
Java 技术栈全景指南:从基础到微服务的完整知识体系
java·开发语言·微服务
Escalating_xu2 小时前
【C 语言】深入理解指针(2):数组名、数组传参、二级指针与指针数组
java·c语言·开发语言