第十四章 集合(Set)

一、Set 接口(P518)

1. Set 接口基本介绍

(1)无序(添加和取出的顺序不一致),没有索引。
(2)不允许重复元素,所以最多包含一个 null。
在这里插入图片描述

2. Set 接口的常用方法

和 List 接口一样,Set 接口也是 Collection 的子接口,因此,常用方法和 Collection 接口一样。

3. Set 接口的遍历方式

同 Collection 的遍历方式一样,因为 Set 接口是 Collection 接口的子接口。
(1)可以使用选代器
(2)增强for
(3)不能使用 索引的方式来获取

二、HashSet(P519)

1. Hashset 的说明

(1)HashSet 实现了 Set 接口。
(2)HashSet 实际上是 HashMap。
(3)可以存放 null 值,但是只能有一个 null。
(4)HashSet 不保证元素是有序的,取决于 hash 后,再确定索引的结果。
(5)不能有重复元素/对象。

2. Hashset底层机制源码说明(P522)

分析 Hashset 底层是 HashMap,HashMap 底层是(数组+链表+红黑树)。

public class HashMap_<K, V> {transient Node<K, V>[] table;transient int modCount;transient int size;public V put(K key, V value) {return putVal(hash(key), key, value, false, true);}static final int hash(Object key) {int h;return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);}final V putVal(int hash, K key, V value, boolean onlyIfAbsent,boolean evict) {Node<K, V>[] tab;Node<K, V> p;int n, i;// 属性table为null或table的长度为0,就扩容if ((tab = table) == null || (n = tab.length) == 0) {n = (tab = resize()).length;}// 如果tab[i]为null,表示没有存放元素,就创建节点并赋值给tab[i]if ((p = tab[i = (n - 1) & hash]) == null) {tab[i] = newNode(hash, key, value, null);} else {Node<K, V> e;K k;// p 和添加元素的hash值相同 并且 (key相同或equals相同),p赋值给eif (p.hash == hash &&((k = p.key) == key || (key != null && key.equals(k)))) {e = p;}// 链表循环比较else {for (int binCount = 0; ; ++binCount) {if ((e = p.next) == null) {p.next = newNode(hash, key, value, null);break;}if (e.hash == hash &&((k = e.key) == key || (key != null && key.equals(k)))) {break;}p = e;}}if (e != null) { // existing mapping for keyV oldValue = e.value;if (!onlyIfAbsent || oldValue == null) {e.value = value;}return oldValue;}}++modCount;if (++size > threshold) {resize();}return null;}int threshold;final float loadFactor = DEFAULT_LOAD_FACTOR;static final int MAXIMUM_CAPACITY = 1 << 30;static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // 16// 加载因子static final float DEFAULT_LOAD_FACTOR = 0.75f;final Node<K, V>[] resize() {Node<K, V>[] oldTab = table;int oldCap = (oldTab == null) ? 0 : oldTab.length;int oldThr = threshold;int newCap, newThr = 0;if (oldCap > 0) {if (oldCap >= MAXIMUM_CAPACITY) {threshold = Integer.MAX_VALUE;return oldTab;} else if ((newCap = oldCap << 1) < MAXIMUM_CAPACITY &&oldCap >= DEFAULT_INITIAL_CAPACITY) {newThr = oldThr << 1; // double threshold}} else if (oldThr > 0) {newCap = oldThr;} else {// 扩容newCap = DEFAULT_INITIAL_CAPACITY;newThr = (int) (DEFAULT_LOAD_FACTOR * DEFAULT_INITIAL_CAPACITY);}if (newThr == 0) {float ft = (float) newCap * loadFactor;newThr = (newCap < MAXIMUM_CAPACITY && ft < (float) MAXIMUM_CAPACITY ?(int) ft : Integer.MAX_VALUE);}threshold = newThr;// 初始化数组,并赋值给属性tableNode<K, V>[] newTab = (Node<K, V>[]) new Node[newCap];table = newTab;return newTab;}Node<K, V> newNode(int hash, K key, V value, Node<K, V> next) {return new Node<>(hash, key, value, next);}static class Node<K, V> {final int hash;final K key;V value;Node<K, V> next;Node(int hash, K key, V value, Node<K, V> next) {this.hash = hash;this.key = key;this.value = value;this.next = next;}}
}

(1)HashSet 底层是 HashMap。
(2)添加一个元素时,先得到 hash 值 --> 会转成 --> 索引值。
(3)找到存储数据表 table,看这个索引位置是否已经存放的有元素。
(4)如果没有,直接加入。
(5)如果有,调用 equals 比较,如果相同,就放弃添加,如果不相同,则添加到最后。
(6)在 Java8 中,如果一条链表的元素个数达到 TREEIFY_THRESHOLD(默认是8),并且 table 的大小 >= MIN_TREEIFY_CAPACITY(默认64),就会进行树化(红黑树)。

红黑树机制:
(1)HashSet 底层是 HashMap,第一次添加时,table 数组扩容到16,临界值(threshold)是16,加载因子(loadFactor)是0.75=12。
(2)如果table数组使用到了临界值12,就会扩容到162=32,新的临界值就是320.75=24,依次类推。
(3)在Java8中,如果一条链表的元素个数到达TREEIFY_THRESHOLD(默认是8),并且table的大小>=MIN_TREEIFY_CAPACITY(默认64)就会进行树化(红黑树),否则仍然采用数组扩容机制。

三、LinkedHashSet (P528)

1. LinkedHashSet 的说明

(1)LinkedHashSet 是 Hashset 的子类。
(2)LinkedHashSet 底层是一个 LinkedHashMap,底层维护了一个 数组+双向链表
(3)LinkedHashSet 根据元素的 hashCode 值来决定元素的存储位置,同时使用链表维护元素的 次序(图),这使得元素看起来是以插入顺序保存的。
(4)LinkedHashset 不允许添重复元素。
在这里插入图片描述
(1)在 LinkedHashSet 中维护了一个 hash 表和双向链表(LinkedHashSet 有 head 和 tail)。
(2)每一个节点有 pre 和 next 属性,这样可以形成双向链表。
(3)在添加一个元素时,先求hash值,在求索引,确定该元素在 hashtable 的位置,然后将添加的元素加入到双向链表(如果已经存在,不添加【原则和 hashset 一样】)。
(4)遍历 LinkedHashSet 也能确保插入顺序和遍历顺序一致。

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

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

相关文章

数据结构:KMP算法

1.何为KMP算法 KMP算法是由Knuth、Morris和Pratt三位学者发明的&#xff0c;所以取了三位学者名字的首字母&#xff0c;叫作KMP算法。 2.KMP的用处 KMP主要用于字符串匹配的问题&#xff0c;主要思想是当出现字符串不匹配时&#xff0c;我们可以知道一部分之前已经匹配过的的文…

【期刊周报1】医学好刊(SCI/SSCI/EI),含Top,领域广,接收快!

为了向广大学者朋友提供更优质的选刊服务&#xff0c;提高选刊质量&#xff0c;我处现开设周报专栏&#xff0c;以罗列我处合作的优质期刊~ 本期&#xff0c;小编给大家推荐的是医学领域相关的热门期刊&#xff0c;接收领域广&#xff0c;无预警&#xff0c;且在最新检索目录内…

Python遥感影像深度学习指南(2)-在 PyTorch 中创建自定义数据集和加载器

在上一篇 文章中,我们Fast.ai 在卫星图像中检测云轮廓,检测物体轮廓被称为语义分割。虽然我们用几行代码就能达到 96% 的准确率,但该模型无法考虑数据集中提供的所有输入通道(红、绿、蓝和近红外)。问题在于,深度学习框架(如 Keras、Fast.ai 甚至 PyTorch)中的大多数语…

redis哨兵+redis主从复制(在虚拟机centos的docker下)

1.安装docker Docker安装(CentOS)简单使用-CSDN博客 2.redis主从复制 redis主从复制(在虚拟机centos的docker下)-CSDN博客 3.编辑3个redis配置 cd /etc mkdir redis-sentinel cd redis-sentinel/ wget http://download.redis.io/redis-stable/sentinel.confcp sentinel.co…

【并发编程篇】读锁readLock()和写锁writeLock()

文章目录 &#x1f6f8;情景引入⭐解决问题 readLock()和writeLock()都是ReadWriteLock接口中定义的方法&#xff0c;用于获取读锁和写锁。 readLock()方法返回一个读锁&#xff0c;允许多个线程同时获取该锁&#xff0c;以进行并发读取操作。如果当前已有一个写锁或其他线程正…

GIT具体配置步骤详解

GIT配置具体步骤如下 SDK 使用 Repo 工具管理&#xff0c;拉取 SDK 需要配置安装 Repo 工具。 Repo is a tool built on top of Git. Repo helps manage many Git repositories, does the uploads to revision control systems, and automates parts of the development workf…

多维时序 | MATLAB实CNN-BiGRU-Mutilhead-Attention卷积网络结合双向门控循环单元网络融合多头注意力机制多变量时间序列预测

多维时序 | MATLAB实现CNN-BiGRU-Mutilhead-Attention卷积网络结合双向门控循环单元网络融合多头注意力机制多变量时间序列预测 目录 多维时序 | MATLAB实现CNN-BiGRU-Mutilhead-Attention卷积网络结合双向门控循环单元网络融合多头注意力机制多变量时间序列预测预测效果基本介…

ubuntu 22.04 安装mysql服务

完整内容&#xff1a; https://developer.aliyun.com/article/1260321 # 安装服务 sudo apt install mysql-server# 按向导设置root密码 sudo mysql_secure_installation# 使用设置的密码登录 sudo mysql -u root -p也可以使用工具登录&#xff0c;例如: navicat for mysql

协同工作php,PHPOA:灵活、高效、协同,让企业高效运转

原标题&#xff1a;PHPOA&#xff1a;灵活、高效、协同&#xff0c;让企业高效运转PHPOA系统作为一个管理系统&#xff0c;它的职责就是为企业高效运转而服务&#xff0c;以提高企业的办公效率为己任&#xff0c;减少不必要的资源浪费为责任。它保持高度的灵活性、高效性与协同…

ubuntu搭建php开发环境记录

2019独角兽企业重金招聘Python工程师标准>>> 这两天自己在阿里云上面买了一个ecs&#xff0c;系统选的是ubuntu16.04&#xff0c;第一件事就是先搭环境&#xff0c;这次准备使用lamp组合。 Apache安装 首先安装apache服务器&#xff0c;ubuntu下面使用apt-get来下载…

Web端H.265播放器研发解密

音视频编解码对于前端工程师是一个比较少涉足的领域&#xff0c;涉及到流媒体技术中的文本、图形、图像、音频和视频多种理论知识的学习&#xff0c;才能够应用到具体实践中&#xff0c;本团队在多媒体领域深耕两年多&#xff0c;才算是有一定产出&#xff0c;我们自研web播放器…

拳击 武术java父类,拳击是一种很有力量的武术类型

原标题&#xff1a;拳击是一种很有力量的武术类型拳击是一种很有力量的武术类型&#xff0c;拳击比赛策略有很多&#xff0c;围绳技术是其中之一。那么拳击比赛策略技巧有哪些呢&#xff1f;下面养生之道网为您解析拳击比赛策略技巧有哪些&#xff0c;看看吧。1、当拳手靠在围绳…

kaka 1.0.0 重磅发布,服务于后端的事件领域模型框架。

百度智能云 云生态狂欢季 热门云产品1折起>>> kaka 1.0.0正式发布了&#xff0c;从三个月前的kaka-notice-lib 1.0.0的发布&#xff0c;经过多次研磨&#xff0c;终于迎来了本次重大更新。 kaka是一款服务于java后端的事件领域模型框架&#xff0c;主要目的为解耦业…

如何把WAV格式音频转换为MP3格式

WAV为微软公司&#xff08;Microsoft)开发的一种声音文件格式&#xff0c;它符合RIFF(Resource Interchange File Format)文件规范&#xff0c;用于保存Windows平台的音频信息资源&#xff0c;被Windows平台及其应用程序所广泛支持&#xff0c;因此在声音文件质量和CD相差无几&…

恶意软件盯上了加密货币,两家以色列公司受到攻击

近日&#xff0c;网络安全公司Palo Alto Networks威胁研究部门Unit 42发博称&#xff0c;已确认Cardinal RAT自2017年4月起对两家从事外汇和加密交易软件开发的以色列金融科技公司发起过攻击。 Cardinal RAT是可远程访问特洛伊木马&#xff08;RAT&#xff09;&#xff0c;攻击…

php 自定义打印模板下载,PHP – 创建自定义模板系统?

我已经在这里搜索过,令人惊讶的是我找不到答案.我发现了一个类似的线程,但没有真正的解决方案.复杂的部分是循环,如果我不需要循环我可以只是做一个常规替换.所以,我有一个带有一些标记的.html文件,如下所示&#xff1a;{{startloop}}{{imgname}}{{endLoop}}我想要做的是用其他…

腾讯财报中“最大秘密”:2018云收入91亿元,交首份TO B答卷

腾讯财报中“最大秘密”云业务收入又一次被公开了&#xff1a;2018年&#xff0c;腾讯云收入91亿元&#xff0c;增长100%。 3月21日&#xff0c;腾讯发布2018年Q4及全年财报&#xff0c;2018全年收入3126.94亿元同比增长32%&#xff0c;净利润(Non-GAAP)774.69亿元。而被列进“…

根据坐标如何在matlab中l连成曲线,matlab中,如何将两条曲线画在一个坐标系里,plot(x1,x2,y1,y2)还是怎样...

matlab中&#xff0c;如何将两条曲线画在一个坐标系里&#xff0c;plot(x1,x2,y1,y2)还是怎样以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;matlab中&#xff0c;如何将两条曲线画在一个坐…

java已被弱化签名,高效Java第四十条建议:谨慎设计方法签名

作用有助于设计易于学习和使用的API。如何做——谨慎地选择方法的名称1.选择易于理解的&#xff0c;并且与同一个包中的其他名称风格一致的名称。2.选择与大众认可的名称相一致的名称。如何做——不要过于追求提供便利的方法每个方法都应该尽其所能。方法太多会使类难以学习、使…

phpexcel.php linux,phpexcel在linux系统报错如何解决

最近有个tp3.2的项目迁移到linux系统上了&#xff0c;突然有天发现原本在win server 2008上运行没问题的excel导出功能在新的系统上不能使用了。报错如下&#xff1a;说是1762行有问题&#xff0c;找到这个文件的代码看看&#xff1a;/*** Get an instance of this class** acc…