集合详解—Set集合

article/2025/8/24 21:25:39

Set接口

Set接口是Collection的子接口,set接口没有提供额外的方法

Set 集合不允许包含相同的元素,如果试把两个相同的元素加入同一个Set 集合中,则添加操作失败

Set 判断两个对象是否相同不是使用 == 运算符,而是根据 equals() 方法

Set接口的实现类之一:HashSet

HashSet 是 Set 接口的典型实现,大多数时候使用 Set 集合时都使用这个实现类。

HashSet 按 Hash 算法来存储集合中的元素,因此具有很好的存取、查找、删除性能。

HashSet 具有以下特点:

  • 无序性:不等于随机性。存储的数据在底层数组中并非按照数组索引的顺序添加,而是根据数据的哈希值决定的。
  • 不可重复性:保证添加的元素按照equals()判断时,不能返回true,即:相同的元素只能添加一个。
  • 集合元素可以是 null

HashSet 集合判断两个元素相等的标准:两个对象通过 hashCode() 方法比较相等,并且两个对象的 equals() 方法返回值也相等。

对于存放在Set容器中的对象,对应的类一定要重写equals()和hashCode(Object obj)方法,以实现对象相等规则。即:“相等的对象必须具有相等的散列码”。

向HashSet中添加元素的过程:向HashSet中添加元素a,首先调用元素a所在类的hashCode()方法,计算元素a的哈希值,此哈希值接着通过某种算法计算出在		HashSet底层数组中的存放位置(即为:索引位置),判断数组此位置上是否已经有元素:如果此位置上没有其他元素,则元素a添加成功。 --->情况1如果此位置上其他有元素(或以链表形式存在的多个元素),则比较元素a与元素b的hash值:如果hash值不相同,则元素a添加成功。--->情况2如果hash值相同,进而需要调用元素a所在的类的equals()方法:equals()返回true,元素a添加失败equals()返回false,则元素a添加成功。--->情况2对于添加成功的情况2和情况3而言:元素a 与已经存在指定索引位置上数据以链表的方式存储。其中jdk7和jdk8中添加的位置还有所不同jdk7:头插法jdk8:尾插法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OUEcKkCz-1614868232498)(assets/image-20210212132446570.png)]

重写hashCode()方法的基本原则

  • 在程序运行时,同一个对象多次调用 hashCode() 方法应该返回相同的值。
  • 当两个对象的 equals() 方法比较返回 true 时,这两个对象的 hashCode()方法的返回值也应相等。
  • 对象中用作 equals() 方法比较的 Field,都应该用来计算 hashCode 值。

重写equals()方法的基本原则

  • 当一个类有自己特有的“逻辑相等”概念,当改写equals()的时候,总是要改写hashCode(),根据一个类的equals方法(改写后),两个截然不同的实例有可能在逻辑上是相等的,但是,根据Object.hashCode()方法,它们仅仅是两个对象。
  • 因此,违反了“相等的对象必须具有相等的散列码”。
  • 结论:复写equals方法的时候一般都需要同时复写hashCode方法。通常参与计算hashCode的对象的属性也应该参与到equals()中进行计算。

Set实现类之二:LinkedHashSet

  • LinkedHashSet 是 HashSet 的子类

  • LinkedHashSet 根据元素的 hashCode 值来决定元素的存储位置,但它同时使用双向链表维护元素的次序,这使得元素看起来是以插入顺序保存的。

  • LinkedHashSet插入性能略低于 HashSet,但在迭代访问 Set 里的全
    部元素时有很好的性能。

  • LinkedHashSet 不允许集合元素重复。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HwpTgeO9-1614868232504)(assets/image-20210212133058338.png)]

Set实现类之三:TreeSet

TreeSet 是 SortedSet 接口的实现类,TreeSet 可以确保集合元素处于排序状态。

TreeSet底层使用红黑树结构存储数据,特点:有序,查询速度比List快

新增的方法如下:

  • Comparator comparator()
  • Object first()
  • Object last()
  • Object lower(Object e)
  • Object higher(Object e)
  • SortedSet subSet(fromElement, toElement)
  • SortedSet headSet(toElement)
  • SortedSet tailSet(fromElement)

TreeSet 两种排序方法:自然排序和定制排序。默认情况下,TreeSet 采用自然排序。

排序—Comparable

TreeSet 会调用集合元素的 compareTo(Object obj) 方法来比较元素之间的大小关系,然后将集合元素按升序(默认情况)排列

如果试图把一个对象添加到 TreeSet 时,则该对象的类必须实现 Comparable接口。

  • 实现 Comparable 的类必须实现 compareTo(Object obj) 方法,两个对象即通过compareTo(Object obj) 方法的返回值来比较大小。

Comparable 的典型实现:

  • BigDecimal、BigInteger 以及所有的数值型对应的包装类:按它们对应的数值大小
    进行比较
  • Character:按字符的 unicode值来进行比较
  • Boolean:true 对应的包装类实例大于 false 对应的包装类实例
  • String:按字符串中字符的 unicode 值进行比较
  • Date、Time:后边的时间、日期比前面的时间、日期大

向 TreeSet 中添加元素时,只有第一个元素无须比较compareTo()方法,后面添加的所有元素都会调用compareTo()方法进行比较。

因为只有相同类的两个实例才会比较大小,所以向 TreeSet 中添加的应该是同一个类的对象。

对于 TreeSet 集合而言,它判断两个对象是否相等的唯一标准是:两个对象通过 compareTo(Object obj) 方法比较返回值。

当需要把一个对象放入 TreeSet 中,重写该对象对应的 equals() 方法时,应保证该方法与 compareTo(Object obj) 方法有一致的结果:如果两个对象通过equals() 方法比较返回 true,则通过 compareTo(Object obj) 方法比较应返回 0。

排序—Comparator

TreeSet的自然排序要求元素所属的类实现Comparable接口,如果元素所属的类没有实现Comparable接口,或不希望按照升序(默认情况)的方式排列元素或希望按照其它属性大小进行排序,则考虑使用定制排序。定制排序,通过Comparator接口来实现。需要重写compare(T o1,T o2)方法。

利用int compare(T o1,T o2)方法,比较o1和o2的大小:如果方法返回正整数,则表示o1大于o2;如果返回0,表示相等;返回负整数,表示o1小于o2。

要实现定制排序,需要将实现Comparator接口的实例作为形参传递给TreeSet的构造器。

此时,仍然只能向TreeSet中添加类型相同的对象。否则发生ClassCastException异常。

使用定制排序判断两个元素相等的标准是:通过Comparator比较两个元素返回了0。


http://chatgpt.dhexx.cn/article/MymVQ6Ck.shtml

相关文章

Set集合的简单实现

Set集合 Set集合的特点是不存放重复的元素&#xff0c;常用于去重&#xff0c;而它的具体实现可以用到其他的一些数据结构如&#xff1a;动态数组、链表、二叉搜索树。 /*** Set集合与其抽象方法* param <E>*/ public interface Set<E> {int size();boolean isEm…

微信小程序中当前页中data的Set和Get

一、set set的话直接这样写 setData({ key1:value1, key2:value2, //key表示js中data中的参数&#xff1b; })如下图&#xff1a; 二、get 在js文件中使用data中的数据写法如下 在xxx函数中使用data中的数据 xxx:function(){ var that this console.log(that.data.xxx)…

集合——Set详细分析

简介 Set用于存储无序&#xff08;存入、去除顺序不一定相同&#xff09;元素&#xff0c;值不重复。 对象相等性&#xff1a;引用到堆上同一个对象的两个引用是相等的。 如果对两个引用调用hashCode方法&#xff0c;会得到相同的结果&#xff0c;如果对象所属的类没有覆盖Obje…

集合 List Set的介绍与使用

List接口 1.1 List接口介绍 有序的 collection&#xff08;也称为序列&#xff09;。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引&#xff08;在列表中的位置&#xff09;访问元素&#xff0c;并搜索列表中的元素。与 set 不同…

集合:List和Set

集合 1.集合和数组之间的区别有&#xff1a; 数组的长度是固定的&#xff0c;集合的长度是可变的数组中存储的是同一类型的元素&#xff0c;集合中存储的数据可以是不同类型的&#xff0c;除了泛型限制数组中可以存放基本类型数据或者对象&#xff0c;集合中只能存放对象&…

List集合,Set集合

List集合: 1 ArrayList集合&#xff1a; 优点&#xff1a;查找快 缺点&#xff1a; 元素增删慢 注&#xff1a;日常开发使用最多的功能就是查询数据&#xff0c;遍历数据&#xff0c;所以该集合是最常用的集合。 常用方法&#xff1a; 方法测试&#xff1a; 新建一个集合添…

集合Set

集合的一个关键的特点就是不能存放重复的元素&#xff0c;二分搜索树是一个非常好的实现集合的底层数据结构 1、二分搜索树实现集合&#xff1a; set接口 package Set;public interface Set<E> {void add(E e);boolean contains(E e);void remove(E e);int getSize();b…

C++ 集合set 详解

1.关于set C STL 之所以得到广泛的赞誉&#xff0c;也被很多人使用&#xff0c;不只是提供了像vector, string, list等方便的容器&#xff0c;更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构操作。vector封装数组&#xff0c;list封装了链表&#xff0c;map和se…

set集合使用详解

set集合使用详解 “曾经年少爱追梦&#xff0c;一心只想往前飞。”那会高二&#xff0c;刚刚接触c语言&#xff0c;一发不可收拾&#xff0c;还记得当时为了一个想法和朋友一起想到半夜。现在我还是那个少年&#xff0c;那个又菜又爱玩的少年。 咳咳&#xff0c;set集合容器&am…

OBS录屏如何设置录制窗口大小?

1、在显示录制窗口区右键→滤镜→添加一个裁剪/填充→调整左右顶底部里的数字进行裁剪&#xff0c;调整到合适的录屏大小即可。

如何使用OBS 进行屏幕录制

软件界面 默认的保存位置 C:\Users\XXXX\Videos 如何对屏幕进行录制&#xff08;默认也录制了音频信号&#xff09;

obs屏幕录制暂停

OBS Studio 24.0 RC1 发布 – 有大惊喜OBS Studio 24.0 RC1 发布 – 有大惊喜 OBS Studio 24.0 RC1于今天下午发布&#xff0c;增加了在录制时暂停的功能&#xff0c;允许“无缝地实时删除视频片段”。OBS Studio 24.0 RC1还支持在发生拥塞时自动调整比特率&#xff0c;而不是丢…

OBS录屏软件使用指南

OBS录屏软件使用指南 1 简介2 录屏使用步骤2.1 来源2.2 设置2.2.1 输出2.2.2 视频 2.3 录制 3 总结 1 简介 2 录屏使用步骤 2.1 来源 在来源标签&#xff0c;添加显示器捕获。 2.2 设置 在录屏时&#xff0c;需要进行录屏设置&#xff0c;点击菜单栏文件->设置 2.2.1…

【录屏】OBS如何区域录制

OBS如何区域录制 按住alt拖动红色边框即可隐藏拖动的区域

OBS 录制简单操作说明

把从B站Sky灬素颜看到的关于OBS录制视频的部分文字记录下 视频地址 录制界面捕获 1.首先&#xff0c;新建一个场景。 2.在新建的场景下&#xff0c;点击右边的来源窗口&#xff0c;新建一个捕获方式。 &#xff08;此处注意被捕获的窗口不能最小化&#xff0c;需要浮在桌…

OBS录制黑屏的解决办法

前些时间打开下载了好久一直没打开的obs录屏软件&#xff0c;想把老师的直播网课录下来重复看&#xff0c;但是发现&#xff0c;无论是用显示器捕获还是窗口捕获都是黑屏&#xff0c;然后就百度找了挺多关键词的&#xff0c;有的方法奏效有的不行有的不全面&#xff0c;为了方便…

obs直播录屏软件下载使用教程-制作短视频录制视频教程

现在是短视频的时代&#xff0c;我们需要学一点视频处理技术&#xff0c;录屏也是一项基本能力 下载软件 这里我下载的是obs软件&#xff0c;可以录屏可以直播 https://obsproject.com/ 因为网络原因&#xff0c;一直没有下载成功&#xff0c;开启特殊上网&#xff0c;才算一点…

OBS录制设置基本介绍(1)

1.OBS OBS&#xff08;Open Broadcasting Software&#xff09;是一款免费且开源的跨平台直播和录制软件&#xff0c;它可以将电脑屏幕、摄像头、麦克风和音频源等多种内容混合在一起并进行直播或录制。 1)基本操作介绍&#xff1a; 下载 OBS官网 在OBS官网&#xff08;htt…

直播、录屏软件OBS Studio下载安装操作教程

直播、录屏软件OBS Studio下载安装操作教程 OBS Studio是一款非常强大的免费开源无广告&#xff0c;国外开发的软件&#xff0c;录屏只是它的一部分功能&#xff0c;对于需要录制屏幕又要录制摄像头的也很适合&#xff0c;比如现在的直播行业&#xff0c;这款软件是一个不二之…

录屏软件OBS录屏时噪声大的解决办法

1、选择麦克风的滤镜 2、点击右下角号&#xff0c;选择噪声抑制 3、点击确定即可&#xff0c;这样设置就完成了&#xff0c;最后关闭滤镜就可以无噪声录制视频了 你的点赞、评论、收藏和关注是我创作的动力。 感谢各位看官老爷