集合(二)Collection集合Set

一、无序列表Set: 是一个散列的集合,数据会按照散列值存储的,如两个hello的散列值相同,会存储在同一个地址中,所以看到的就是只有一个hello在集合中了。

1、Set集合有两个主要的实现子类:Hashset和Treeset。hashset是去重复,而Treeset需要实现compareble接口来排序(比较其实是一种变向的去重复,一旦两个对象比较的元素相同,这两个对象只会存一个进去)。

2、Set的特征:
不会出现重复的元素(按照equals 和hashCode 的规则比较是否重复)
Set属于Collection的子接口,拥有Collection的所有的方法;
Set 是散列存储没有位置编号,没有按照编号进行操作的方法。

注意Set<T>如果这个T没有正确重写equals和hashCode方法,会存入重复值。而List<T>即使T正确重写了equals和hsahCode方法,也会存入重复值。

二、Hashset:无序,不排序。

1、底层原理:HashSet底层是哈希表结构的。哈希表:

(1)JDK8之前,底层采用数组+链表实现。

HashSet<String> haset1 = new HashSet<>();

创建一个空的hashSet时,底层创建一个默认长度16,默认加载因子0.75的数组,数组名table 

(2)JDK8以后,底层进行了优化。由数组+链表+红黑树实现:如果链表长度很长时,新存入的元素,需要通过equals比较的次数就越多,性能就会降低,即链表长度越长,添加元素时,效率越低,jdk1.8对此进行了优化,当链表长度为8时,再次添加元素自动转换成红黑树 ,当链表长度小于6时,自动转为链表。好处 equals比较次数减少,小了往左边比较,大了往右边比较。

2、线程安全问题:

线程不安全。

public static void main(String[] args) {Set<String> hashSet = new HashSet<>();for (int i = 0; i < 10; i++) {new Thread(() -> {//向集合中添加内容hashSet.add(UUID.randomUUID().toString().substring(0, 8));//从集合中获取内容System.out.println(hashSet);}, String.valueOf(i)).start();}}/*Exception in thread "0" java.util.ConcurrentModificationExceptionat java.util.HashMap$HashIterator.nextNode(HashMap.java:1445)at java.util.HashMap$KeyIterator.next(HashMap.java:1469)at java.util.AbstractCollection.toString(AbstractCollection.java:461)at java.lang.String.valueOf(String.java:2994)at java.io.PrintStream.println(PrintStream.java:821)at HashSetDemo.lambda$main$0(HashSetDemo.java:13)at java.lang.Thread.run(Thread.java:748)*/
}

HashSet线程不安全解决方案: 

三、Treeset:

1、底层原理:

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

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

相关文章

贯穿设计模式-建造者模式+代理模式+原型模式

样例代码 涉及到的项目样例代码均可以从https://github.com/WeiXiao-Hyy/Design-Patterns.git获取 需求 个人或公司需要开发票时&#xff0c;会有个人发票和企业发票的区别 -> 建造者模式&#xff1b;不同业务部门可能都需要使用发票数据&#xff0c;需要拷贝同一份发票 -&g…

Day2Qt

1.使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数&#xff0c;将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#xff…

XREAL推出其新款AR眼镜:XREAL Air 2 Ultra,体量轻内置音效

这款眼镜堪称科技的杰作&#xff0c;它以钛合金为框架&#xff0c;尽显轻盈与精致。配备的双3D环境传感器&#xff0c;宛如双眼般敏锐&#xff0c;能精准捕捉头部运动&#xff0c;让你在虚拟与现实间自由穿梭。120Hz的超高刷新率与500尼特的亮度&#xff0c;让你在4米之外感受1…

代码随想录算法训练营Day19 | 77.组合、216.组合总和|||、17.电话号码的字母组合

回溯问题的模板 public static void backtracking(参数列表){if(终止条件){存放结果return;}for(选择&#xff1a;本层集合中元素&#xff08;树中节点孩子的数量就是集合的大小&#xff09;){处理节点;backtracking(路径&#xff0c;选择列表); // 递归回溯&#xff0c;撤销处…

Spring之启动过程源码

文章目录 一. Spring初始化流程二. 源码分析1. 初步分析2. 核心方法refresh() 三. 事件发布机制1. 简介2. 源码分析 一. Spring初始化流程 前面的内容我们已经把Bean的生命周期的源码已经分析完了。现在我们从容器的角度去分析源码&#xff0c;这一部分首先着重分析一下Spring…

PCL 大地坐标转空间直角坐标(C++详细过程版)

目录 一、算法原理二、代码实现三、结果展示四、测试数据本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT生成的文章。 一、算法原理 二、代码实现 头文件及读取保存函数见:PCL 空间直角坐标转大地坐标(直接求解法C…

docker打包介绍

最近在做一个开源项目&#xff0c;遇到开发者问各种问题&#xff0c;发现都是系统和软件版本的差异引起的。于是了解了一下docker的使用&#xff0c;发现docker真是个好东东&#xff0c;基本解决了各种版本差异的问题&#xff0c;真正做到了一键部署使用。 先熟悉一下docker里…

使用迭代优化递归程

王有志&#xff0c;一个分享硬核Java技术的互金摸鱼侠加入Java人的提桶跑路群&#xff1a;共同富裕的Java人 今天我们将会分析上篇文章中递归算法存在的问题&#xff0c;并通过迭代去优化。 递归存在的问题 上一篇中&#xff0c;我们计算了序号10以内的斐波那契数。今天为了清…

解析IT运维领域ITSS和ITIL证书

&#x1f33b;IT运维领域ITSS和ITIL证书是两种广泛认可的专业认证。 &#x1f4d7;ITSS认证证书 ITSS是中国电子技术标准化研究院推出的&#xff0c;&#x1f449;包含“IT 服务工程师”和“IT 服务经理”的系列培训。有效满足GB/T 28827.1 的符合性评估要求和ITSS服务资质升级…

软件测试|MySQL ORDER BY详解:排序查询的利器

简介 在数据库中&#xff0c;我们经常需要对查询结果进行排序&#xff0c;以便更好地展示数据或满足特定的业务需求。MySQL提供了ORDER BY子句&#xff0c;使我们能够轻松地对查询结果进行排序。本文将详细介绍MySQL ORDER BY的用法和示例&#xff0c;帮助大家更好地理解和应用…

74应急响应-winlinux分析后门勒索病毒攻击

#操作系统(windows,linux)应急响应&#xff1a; 1.常见危害&#xff1a;暴力破解&#xff0c;漏洞利用&#xff0c;流量攻击&#xff0c;木马控制(Webshell,PC 木马等)&#xff0c;病毒感染(挖矿&#xff0c;蠕虫&#xff0c;勒索等)。 2.常见分析&#xff1a;计算机账户&…

有趣的前端知识(二)

推荐阅读 智能化校园&#xff1a;深入探讨云端管理系统设计与实现&#xff08;一&#xff09; 智能化校园&#xff1a;深入探讨云端管理系统设计与实现&#xff08;二&#xff09; 文章目录 推荐阅读HTML元素元素属性头部元素列表元素区块元素表单元素 颜色字符实体 HTML元素 …