关于Set集合类你都知道什么?来自《卷Ⅰ》的灵魂提问

在这里插入图片描述

  各位小伙伴们大家好,欢迎来到这个小扎扎的《Java核心技术 卷Ⅰ》笔记专栏,在这个系列专栏中我将记录浅学这本书所得收获,鉴于 看到就是学到、学到就是赚到 精神,这波简直就是血赚

💡涉及的知识点速通

  • 🛫 关于Set集合类你都知道什么?
    • 🪂 如何理解Set集合元素的无序不可重复?
    • 🪂 如何重写equals和hashCode方法?
    • 🪂 HashSet和LinkedHashSet的异同?
    • 🪂 TreeSet都需要注意哪些?
    • 🪂 集合和数组之间如何相互转换?
  • 🛫 Collection集合类的关系图

🛫 关于Set集合类你都知道什么?

  我们将实现了Set接口的类称为是List集合类,List集合类中元素存储有一个特点:无序、不可重复,Set接口常用的有三个实现类:HashSet、linkedHashSet、TreeSet

🪂 如何理解Set集合元素的无序不可重复?

  无序性: 以HashSet集合为例,HashSet底层创建的是HashMap,而HashMap最主要的数据结构就是散列表,java使用链表数组来实现散列表,也就是一种数组加链表的结构,在这里数组中的每个元素被称为是(bucket,默认为16)。所谓的元素无序存储指的是:存储的元素并不是按照索引顺序依次存入数组,而是使用哈希算法也就是将元素的散列码(hash值)对桶数进行取模运算,得到的结果就是该元素在数组中存储的索引位置在这里插入图片描述  Object类中定义的有hashCode方法可以获取该对象对应的散列码(hash值),又因为Object类是所有类的超类,所以每一个类的对象都能通过hashCode方法获取到它所对应的散列码,但是值得注意的是:使用hashCode生成的散列码不同意味着它们肯定不相等,但是散列码相等并不就意味着它们一定相等,所以说如果想要判断它们是否相等需要再进行equals对比,如果equals的结果也为true的话表示它们一定相等

  不可重复性: 这里我们同样以HashSet集合为例,散列码相同的元素一定会被分到数组的同一个索引位置进行存储,此时如果我们再判断一下新添加的元素与该索引位置上链表元素的散列码是否相等,如果相等再进行equals比较,如果还相等则说明新增元素是个重复元素,这样的话就可以保证set集合中的元素不会重复了

  元素添加顺序: 在jdk7和jdk8中新元素的添加顺序也是不一样的,在jdk7中是新元素 “上位” 指向链表中原来最新的元素;而jdk8中则是将新元素 “下位” 放在链表的末尾,原来最新的元素指向新元素。可以使用成语 “七上八下” 方便记忆在这里插入图片描述

🪂 如何重写equals和hashCode方法?

  众所周知的是,Object类是所有类的超类,所以说如果在不重写equals和hashCode方法的情况下,set集合判断添加的是否是重复元素使用的就是Object类中的equals和hashCode方法,但是Object中的equals方法比较的是地址值、hashCode方法是通过地址值生成一个hash值。由此可见,即使自定义类的属性值都一样依然会被set集合识别为非重复值,因为他们存储的地址不同。所以说,自定义类如果使用到hash结构的话,最好重写equals和hashCode方法

  重写后的equals和hashCode方法要尽量保持结果一致,也就是说当equals结果为true的时候hashCode的散列码也要相等,那么如何做到这一点呢?那就是在重写这两种方法进行比较或者生成hash值的时候,尽量使用相同的字段,这里可以参考IDEA中默认重写的equals和hashCode的写法在这里插入图片描述

🪂 HashSet和LinkedHashSet的异同?

  三者相同点:HashSet、LinkedHashSet和TreeSet都实现了Set接口,所以它们存储数据的特点都一致,那就是无序、不可重复。而且Set接口中并没有额外定义新的API方法,也就是说Set集合类中的API都是从Collection接口中继承过来的

  HashSet是LinkedHashSet的父类,HashSet和LinkedHashSet中可以存储null元素,而且这两种set集合都是线程不安全的。除此之外,二者的差距就是LinkedHashSet在HashSet的基础上又可以将所有的元素按照存入的顺序遍历出来,这并不就意味着LinkedHashSet中存储的元素就是有序的,而是它在HashSet底层散列表的基础上又使用双向链表将元素按照顺序前后链接起来,当遍历集合元素的时候就可以顺着双向链表依次输出

🪂 TreeSet都需要注意哪些?

  首先TreeSet不可以存储null元素,否则就会抛出NullPointerException异常。其次TreeSet可以将添加的元素进行排序,但是添加进来的必须是相同类型的元素,否则就会抛出ClassCastException异常在这里插入图片描述  在类型一致的情况下,如果添加的元素是自定义类型的话,必须手动定义排序规则,定义的方式主要有两种

  第一种是自然排序,即实现Comparable接口重写compareTo方法,在方法中指定TreeSet集合元素排序的规则,具体使用可以参考下面的截图在这里插入图片描述  第二种是定制排序,即创建TreeSet集合对象时向参数中传递一个comparator对象,该对象应该重写compare方法并指定排序规则,具体使用可以参考下面的截图在这里插入图片描述  从上面两个例子可以得知一个十分重要的结论:TreeSet集合判断元素是否重复的规则不再是equals加hashCode方法,而是compareTo方法或者compare方法的返回值,返回值为零则说明元素重复,无法添加到集合中。

🪂 集合和数组之间如何相互转换?

集合转数组
  使用Collection接口里的toArray方法,可以将集合转成一个object数组,而且还可以使用数组对象作为参数指定转换的数组类型在这里插入图片描述数组转集合
  数组转List集合的话可以使用Arrays的asList方法,转成其他集合的话应该使用循环将数组中的元素依次添加到空集合中,并没有现成的API可以使用在这里插入图片描述由此可见,Arrays中的asList方法将基本数据类型数组对象当成一个元素转换成List集合,但是该类型对应的包装类数组是将数组中的数据对象当成一个元素转换成List集合

🛫 Collection集合类的关系图

  至此,我们已经学习了整个Collection集合的常用实现类,在这里我整理了一下Collection集合的关系图谱供大家参考学习在这里插入图片描述

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

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

相关文章

流程图虚线框表示什么_UI设计|APP的交互线框布局设计

一.流程图设计流程图(Flow Chart):用图示的方式反映出特定主体为了满足特定需求而进行的有特定逻辑关系的一系列操作过程。流程图的四种基本结构:顺序结构,条件结构(又称选择结构),循环结构,分支结构。1.流程图的常用符…

使用Redis完成商品秒杀业务

各位小伙伴们大家好,欢迎来到这个小扎扎的Redis 6专栏,在这个系列专栏中我对B站黑马的Redis教程进行一个总结,鉴于 看到就是学到、学到就是赚到 精神,这波依然是血赚 ┗|`O′|┛ 💡Redis知识点速览&#…

表格列隐藏_【excel每日提升】Excel隐藏列,不让别人打开!

【新朋友】点击标题下面蓝色字“王俊东“关注。 【老朋友】点击右上角,转发或分享本页面内容。excel系列课程excel特效系列课程开始了,今天第2节!第1节:Excel有公式的单元格标记颜色,很简单!第2节&#xf…

map与weakmap,ES6 Map和WeakMap有什么区别?

Looking this and this MDN pages it seems like the only difference between Maps and WeakMaps is a missing "size" property for WeakMaps. But is this true? Whats the difference between them?解决方案The experienced JavaScript programmer will notice…

“毕业季”|一个java开发实习生的OFFER之路

哈喽哈喽大家好,这里是小扎扎的博客。相信有关注过我的好盆友们可能会发现我已经有一段时间没有出来划水了,那么这段时间小扎扎都在干什么呢?没错!我确实是去找实习了!接下来就给大家介绍一下本次战役的战况如何 活动地…

virtualbox 该内存不能为written_系统提示“该内存不能为read”的原因和解决办法...

我们单位的电脑经常显示这个对话框,已经有好几年了,单位的老头们都不怎么懂电脑,我本人也不爱管闲事。但是出现这种对话框的原因是什么呢?又怎么解决呢?一般电脑经常出现蓝屏和死机,而且频繁出现。有时会出…

插件properties_Mybatis3系列 - 4. mybatis-config的properties属性详解

前两章简单的讲解了MyBatis的使用方式. 接下来先全局的说一下MyBatis的全局的xml配置详细说明.XML格式定义-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">configuration 的映射文件(根据定义顺序说明)properties 属性…

【Redis 6】秒杀业务——分布式锁

各位小伙伴们大家好,欢迎来到这个小扎扎的Redis 6专栏,在这个系列专栏中我对B站黑马的Redis教程进行一个总结,鉴于 看到就是学到、学到就是赚到 精神,这波依然是血赚 ┗|`O′|┛ 💡Redis知识点速览&#…

python读取文件最后几行_如何用python获取文件的最后一行,文件可能会比较大

展开全部 #!/usr/bin/env python import os import sys def get_last_n_lines(logfile, n): blk_size_max 4096 n_lines [] with open(logfile, rb) as fp: fp.seek(0, os.SEEK_END) cur_pos fp.tell() while cur_pos > 0 and len(n_lines) < n: blk_size min(blk_si…

360oauth token是什么意思_Oauth/access token

oauth/access_token第三放应用使用开始的request_token来换取用户授权过的Access_tokenURL格式标准的OAuth http返回格式HTTP请求方式POST请求数限制false请求参数oauth_consumer_key: 创建应用时生成的APP KEY。oauth_token:经过用户授权的Request Token。oauth_signature_met…

【Swagger】看这一篇就够了

各位小伙伴们大家好&#xff0c;欢迎跟着小扎扎一起学习【Swagger】这门技术&#xff0c;在本片博客中我对B站狂神的Swagger教程进行一个总结&#xff0c;鉴于 看到就是学到、学到就是赚到 精神&#xff0c;这波依然是血赚 ┗|&#xff40;O′|┛ &#x1f4a1;Swagger知识点…

python mockito arg_that_wqingxiao

偶然间在脉脉上看到了一道头条的算法面试题按照题目的理解&#xff0c;简单的写了一个html网页pool开始{{index}}{{index}}var vm new Vue({el: #vue_det,data: {list: [],i: 0},methods: {details: function () {return this.site " - 学的不仅是技术&#xff0c;更是梦…

用python画大雄_python制作斗图生成器

网上各种带文字的表情图片都被大家玩坏了&#xff0c;今天就和大家一起用 python 亲自做一个带字表情图片生成器。 不知道大家有没有看到网上有很多人都在说 "人生苦短&#xff0c;我用 python"&#xff0c;这句话我之前也不是很理解&#xff0c;觉得人生苦短和用pyt…

【spring cloud】(一)使用idea创建可相互调用的多模块应用

各位小伙伴们大家好&#xff0c;欢迎来到这个小扎扎的spring cloud专栏&#xff0c;在这个系列专栏中我对B站尚硅谷阳哥的spring cloud教程进行一个总结&#xff0c;鉴于 看到就是学到、学到就是赚到 精神&#xff0c;这波依然是血赚 ┗|&#xff40;O′|┛ &#x1f4a1;spr…

epson彩色打印机加墨水_爱普生打印机墨盒如何加墨?

展开全部掌握以下几点步骤&#xff0c;即可轻松加墨。1、首先&#xff0c;从打印机上取下墨盒&#xff0c;32313133353236313431303231363533e4b893e5b19e31333365646234这里就不好做介绍了&#xff0c;取下墨盒的方法因机而异。将墨盒上的一层贴纸撕掉&#xff0c;并拿出所需材…

python字符串百分号_Python字符串格式化的2种方法

本文介绍了Python字符串格式化&#xff0c;主要有两种方法&#xff0c;分享给大家&#xff0c;具体如下 用于字符串的拼接&#xff0c;性能更优。 字符串格式化有两种方式&#xff1a;百分号方式、format方式。 百分号方式比较老&#xff0c;而format方式是比较先进的&#xff…

【踩坑,已解决】spring cloud删除子模块后创建同名模块时遇到的删除不净,java、resources包失效,java、resources包被标记为模块等问题

&#x1f4a1;问题速览&#x1f4cc; 问题复现&#x1f4cc; 没有任何操作&#xff0c;model又出现了&#x1f4cc; 模块重建后java、resources包失效&#x1f4cc; 模块重建后java、resources包被标记为了模块&#x1f4cc; 问题复现 本人是在跟着B站尚硅谷的视频练习Spring c…

蓝牙扫描过程解析_智慧定位系统之蓝牙网关在室内定位技术的原理浅析-新导智能...

蓝牙室内定位技术是利用在室内安装的若干个蓝牙局域网接入点&#xff0c;把网络维持成根据多用户的基础网络连接形式&#xff0c;并确保蓝牙局域网接入点始终是这个微网的主设备&#xff0c;然后经过丈量信号强度对新加入的盲节点进行三角定位。苏州新导实时定位体系(RTLS)和室…

【spring cloud】(二)服务的注册发现——Eureka

各位小伙伴们大家好&#xff0c;欢迎来到这个小扎扎的spring cloud专栏&#xff0c;在这个系列专栏中我对B站尚硅谷阳哥的spring cloud教程进行一个总结&#xff0c;鉴于 看到就是学到、学到就是赚到 精神&#xff0c;这波依然是血赚 ┗|&#xff40;O′|┛ &#x1f4a1;spr…

python选择题题库百度文库_大学Python程序题题库

程序设计 题目&#xff1a;补充 fun 函数&#xff0c;其功能是判断一个整数是否是素数&#xff0c;在主 函数 main 中输入一个整数&#xff0c;调用该 fun 函数进行判断并输 出结果。 要求&#xff1a;使用 math 相关函数 import math def fun(n): i,w2,0 if n<1: w1 while …