Set集合(Java) 及底层原理

news2024/12/25 1:59:19

SET<E>是一个接口,添加的元素是无序的:添加数据的顺序和获取出的数据顺序不一致;不重复,无索引。

实现类:

1.HashSet:无序不重复无索引

2.LinkedHashSet:有序不重复无索引

3.TreeSet:排序不重复无索引

一、HashSet

//创建一个Set集合对象
        Set<Integer> set;
        set = new HashSet<>(); //创建了一个HashSet集合对象    无序不重复无索引
        set.add(66);set.add(34);set.add(54);set.add(16);set.add(87);set.add(435);set.add(66);
        System.out.println(set);  //[16, 66, 34, 435, 54, 87]
        //注意:这里的无序只会无序一次,定下来以后就不改变

 HashSet集合底层原理

哈希值是一个int类型的数值,Java中每个对象都有一个哈希值

Java中的所有对象,都可以调用OBject类提供的hashCode方法,返回该对象自己的哈希值

同一个对象多次调用hashCode()方法返回的哈希值是相同的

不同的对象他们的哈希值一般不相同,但也有可能会相同(哈希碰撞)

--------------------------------------------------------------------

HashSet底层原理是基于哈希表实现的,哈希表是一种增删改查数据性能都比较好的数据结构,JDK8开始,哈希表是由数组+链表+红黑树组成的。

JDK8之前哈希表:数组+链表

创建HashSet集合对象并且第一次添加数据的时候会创建一个默认长度16的数组,默认加载因子0.75,数组名table,然后使用元素的哈希值对数组的长度求余计算出存入的位置,判断当前位置是否为null,如果是就直接存入,如果不为null,就调用equals比较,如果相等就不存,如果不相等就JDK8之前:把新元素存入数组,占老元素位置,老元素挂下面;JDK8之后:直接把新元素挂老元素下面。

一旦占了12个,数组会扩容,达到优化性能的目的,JDK8之后,当链表长度超过8,且数组长度>=64时,自动将链表转换成红黑树。

注意:HashSet集合默认不能对内容一样的两个不同对象去重

那么如何实现对内容一样的两个不同对象去重复呢?

必须通过重写对象的hashCode()和equals()方法:

equals:只要两个对象内容一样就返回true。

hashCode:只要两个对象内容一样,哈希值就一样。

二、LinkedHashSet

//创建一个Set集合对象
        Set<Integer> set;
        set = new LinkedHashSet<>(); //创建了一个LinkedHashSet集合对象    有序不重复无索引
        set.add(66);set.add(34);set.add(54);set.add(16);set.add(87);set.add(435);set.add(66);
        System.out.println(set);  //[66, 34, 54, 16, 87, 435]

  LinkedHashSet集合底层原理

依然是基于哈希表实现的,但是每一个元素都额外多练一个双链表的机制记录它前后元素的位置。

三、TreeSet

//创建一个Set集合对象
        Set<Integer> set;
        set = new TreeSet<>(); //创建了一个TreeSet集合对象    排序不重复无索引
        set.add(66);set.add(34);set.add(54);set.add(16);set.add(87);set.add(435);set.add(66);
        System.out.println(set);  //[16, 34, 54, 66, 87, 435]

注意:Set要用到的常用方法,基本上就是Collection提供的

TreeSet底层原理

对于数值类型,默认按照数值本身的大小进行升序排序

对于字符串类型,默认按照首字符的编号升序排序

对于自定义类型,默认无法直接排序,必须指定排序规则:

1.让自定义的类实现Comparable接口,重写compareTo方法来制定比较规则:

2.通过调用TreeSet集合有参构造器,可以设置Comparator对象:

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

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

相关文章

最佳 PDF 转 Word 转换器软件,可实现无缝转换

如今&#xff0c;PDF文件格式因其高安全性而被计算机用户所熟悉&#xff0c;这使得无法直接编辑内容。因此&#xff0c;每当用户需要复制内容时&#xff0c;都会遇到很多困难。在这里将介绍了一些可以让您将 PDF 转换为 Word 的工具。 借助高效、免费的 PDF 转 Word 转换器软件…

离散数学(一) 集合

属于关系 表示 枚举法&#xff1b; 叙述法&#xff1b; 文氏图法 基数 空集 全集 全集是相对唯一的 相等关系 有相同元素看作一个元素 包含关系 幂集 集合运算 并集 交集 补集 差集 对称差集 定理 可数集合与不可数集合 自然数集 等势 如果存在集合A到集合B的双射(又称一一…

PostgreSQL如何使用UUID

离线安装时&#xff0c;一般有四个包&#xff0c;都安装的话&#xff0c;只需要开启uuid的使用即可&#xff0c;如果工具包(即 postgresql11-contrib&#xff09;没有安装的话&#xff0c;需要单独安装一次&#xff0c;再进行开启。 开启UUID方法 下面介绍一下如何开启&#…

分布式事务Seata的使用详解

一、事务概述 事务指的就是一个操作单元&#xff0c;在这个操作单元中的所有操作最终要保持一致的行为&#xff0c;要么所有操作 都成功&#xff0c;要么所有的操作都被撤销。简单地说&#xff0c;事务提供一种“要么什么都不做&#xff0c;要么做全套”机制。 1.1.本地事物 …

Linux基础知识——命令行模式下命令的执行

文章目录 Linux基础知识——命令行模式下命令的执行开始执行Linux命令Linux基础命令的操作常用Linux命令行操作按键Linux输出错误信息查看 Linux系统在线帮助--help选项man命令info命令其他有用的文件文档百度搜索 文本编辑器&#xff1a;nanonano启动&#xff01; 正确关机方法…

自动化行业文件数据\资料防泄密软件——天锐绿盾|@德人合科技

天锐绿盾是一款自动化行业文件数据防泄密软件&#xff0c;由德人合科技提供。该软件采用动态加解密技术&#xff0c;能够有效防止公司内部数据泄密&#xff0c;同时支持各种文件格式加密&#xff0c;如CAD、OFFICE、PDF、图纸等。 PC端&#xff1a;https://isite.baidu.com/sit…

第1讲-introduction

计算机组成与结构简介 计算机的基本组成 计算机的层次结构

从零开始学逆向:理解ret2syscall

1.题目信息 链接&#xff1a;https://pan.baidu.com/s/19ymHlZZmVGsJHFmmlwww0w 提取码&#xff1a;r4el 首先checksec 看一下保护机制 2.原理 ret2syscall 即控制程序执行系统调用来获取 shell 什么是系统调用&#xff1f; 操作系统提供给用户的编程接口是提供访问操作系统…

JavaScript原型继承与面向对象编程思想

原型继承与面向对象编程思想 在JavaScript中&#xff0c;原型(prototype)、构造函数(constructor)和实例对象(instance)是面向对象编程中的重要概念&#xff0c;并且它们之间存在着紧密的关系。 原型(prototype)&#xff1a;原型是JavaScript中对象之间关联的一种机制。每个Ja…

ElasticSearch之bool多条件查询

写在前面 在实际的业务场景中&#xff0c;不可能只是简单的单值查询 &#xff0c;更多的是n个条件的综合查询&#xff0c;就像下面的搜索&#xff1a; 针对这种场景我们就需要依赖于bool查询了&#xff0c;本文就一起来看下这部分的内容。 1&#xff1a;bool查询介绍 bool查…

第十一天-Excel的操作

目录 1.xlrd-Excel的读模块 安装 使用 获取工作簿 读取工作簿的内容 xlsxwriter-Excel的写模块 安装 使用 生成图表 add_series参数 图表的样式 demo&#xff1a;生成图表 Excel的操作在python中有多个模块&#xff0c;为了能够快速使用&#xff0c;选择了相对简单…

CloudFlare免费内网穿透

介绍 Cloudflare Tunnel是Cloudflare零信任网络的一个产品&#xff0c;用于打通企业、员工、设备之间的边界&#xff0c;从而摒弃掉VPN之类的过时技术&#xff08;其实也不是过时&#xff0c;只不过是相对来说安全性、可控性较差&#xff09; 通过Cloudflare Tunnel&#xff0c…

国家建筑装配式内装产业基地在沪成立,副主任单位优积科技协同助推绿色低碳循环发展

上海市室内装饰行业协会装配式内装产业专业委员会成立大会暨“国家建筑装配式内装产业基地”项目启动会于3月21日下午1点在上海光大酒店隆重举行。出席此次活动的包括市装协会长徐国俭&#xff0c;市装协党支部书记兼秘书长丛国梁&#xff0c;市装协装配式内装委主任顾泰昌&…

java面试设计模式篇

面试专题-设计模式 前言 在平时的开发中&#xff0c;涉及到设计模式的有两块内容&#xff0c;第一个是我们平时使用的框架&#xff08;比如spring、mybatis等&#xff09;&#xff0c;第二个是我们自己开发业务使用的设计模式。 面试官一般比较关心的是你在开发过程中&#…

TiDB离线部署、Tiup部署TiDB

先做tidb准备工作&#xff1a; 部署 TiDB 前的环境检查操作&#xff1a;TiDB 环境与系统配置检查 | PingCAP 文档中心 1.查看数据盘 fdisk -l &#xff08;2,3&#xff09;本人的分区已经是 ext4 文件系统不用分区&#xff0c;具体官方文档的分区&#xff1a; 4.查看数据盘…

2024生物发酵产品与技术装备展的创新魅力-东特科技

参展企业介绍 温州东特科技有限公司是一家集设计、生产、销售及服务为一体的卫生级流体设备企业。专业从事各种乳食品、制药、化工、啤酒设备、不锈钢卫生级阀门&#xff0c;管件&#xff0c;视镜&#xff0c;及非标配件定制等产品的销售与服务。先进的设计理念专业的技术优势…

SpringBoot+PDF.js实现按需分片加载预览(包含可运行示例源码)

SpringBootPDF.js实现按需分片加载预览 前言分片加载的效果前端项目前端项目结构前端核心代码前端项目运行 后端项目后端项目结构后端核心代码后端项目运行 项目运行效果首次访问分片加载 项目源码 前言 本文的解决方案旨在解决大体积PDF在线浏览加载缓慢、影响用户体验的难题…

路飞项目--06

redis介绍和安装 # 数据库&#xff1a; 关系型数据库&#xff1a;mysql、oracle、postgrasql、sqlserver、sqlite IBM&#xff1a;服务器 Oracle&#xff1a;数据库 达梦 EMC&#xff1a;存储 非关系型数据库: redis、mongodb、es…

一文读懂:AWS 网络对等互连(VPC peering)实用操作指南

VPC peering connection-网络对等互连在您的 Atlas VPC 和云提供商的 VPC 之间建立私有连接。该连接将流量与公共网络隔离以提高安全性。本篇文章有VPC peering的操作指南以及价格等信息。如还有疑问请联系我们MongoDB的销售&#xff0c;客户成功经理或解决方案架构师。 1 使用…

CPU漏洞之Meltdown

1.前言 计算机系统的安全性从根本上依赖于内存隔离&#xff0c;例如内核(Kernel)地址范围被标记为不可访问&#xff0c;并对用户访问加以限制和保护&#xff0c;因此操作系统确保了用户程序不能访问彼此的内存或内核内存。这种内存隔离是我们计算机环境的基石&#xff0c;它允…