集合(二)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底层是哈希表结构的。原理和HashMap相似,HashMap的key集合即为HashSet。

哈希表:

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

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

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

(2)JDK8以后,底层进行了优化。由数组+链表+红黑树实现:如果链表长度很长时,新存入的元素,需要通过equals比较的次数就越多,性能就会降低,即链表长度越长,添加元素时,效率越低,jdk1.8对此进行了优化,当链表长度为8时,再次添加元素自动转换成红黑树 ,当链表长度小于8时,自动转为链表。好处 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线程不安全解决方案:

(1) 通过CopyOnWriteArraySet类来解决

import java.util.HashSet;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.CopyOnWriteArraySet;public class HashSetDemo {public static void main(String[] args) {Set<Object> hashSet = new CopyOnWriteArraySet<>();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();}}
}

(2) 通过Collections.synchronizedSet()解决。

三、Treeset:TreeSet并不是根据插入的顺序来排序,而是根据实际的值的大小来排序。

1、底层原理:TreeSet中使用平衡树,更具体的一个红黑树。

2、线程安全问题:线程不安全。解决方案同HashSet。

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

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

相关文章

【java八股文】之Spring系列篇

【java八股文】之JVM基础篇-CSDN博客 【java八股文】之MYSQL基础篇-CSDN博客 【java八股文】之Redis基础篇-CSDN博客 【java八股文】之Spring系列篇-CSDN博客 【java八股文】之分布式系列篇-CSDN博客 【java八股文】之多线程篇-CSDN博客 【java八股文】之JVM基础篇-CSDN博…

CLion中想要在一个项目中有多个C源文件(有多个main函数)

我们知道&#xff0c;一个项目中只能有一个main()函数&#xff0c;但是我们不想分开创建这么多个C源文件&#xff0c;我们想要在一个工程中允许存在多个main方法了&#xff0c;而且可以独立运行&#xff0c;那么只需要以下步骤即可&#xff1a; 1&#xff09;在 File - Settin…

利用CHAT写实验结论

问CHAT&#xff1a;通过观察放置在玻璃表面上的单个水滴&#xff0c;人们可以观察到水滴充当成像系统。探究这样一个透镜的放大倍数和分辨率。 CHAT回复&#xff1a;实验报告标题&#xff1a;利用玻璃表面的单一水滴观察成像系统的放大倍数和分辨率&#xff1a; 一、 实验目的…

TEMU、亚马逊、shein平台崛起迅猛,掌握自养号测评必备运营攻略

2023年12月&#xff0c;SimilarWeb发布的数据显示&#xff0c;TEMU的独立访客数量达到4.67亿&#xff0c;与Aliexpress持平&#xff0c;全球排名第二。亚马逊以26.59亿用户位居第一&#xff0c;而SHEIN则拥有1.723亿用户&#xff0c;排名第三。 然而&#xff0c;仅仅六个月前的…

vue 渲染数组,拖拽排序,渲染同一个数组拖拽排序不影响其他选中行状态

当我们能够设置单行状态改变的时候&#xff0c;那么肯定可以拿到选中的当前行的id或者下标index。 只要设定一个初始化值在拖拽开始的时候重新赋值&#xff0c;然后再处理选中状态的时候进行判断即可。 前期写的时候没有注意到这个问题&#xff0c;可以看这个文章。 在复测的时…

【CSCV】划分数据集

参考论文IEEE Xplore Full-Text PDF: 划分数据集时多了一个development set&#xff0c;如下图 先占个坑&#xff0c;看完论文再来填坑

吉祥物如何解锁虚拟主持人身份,赋能品牌营销?

在互联网突破时空的整体语境下&#xff0c;一个吉祥物可以解锁虚拟主持人身份&#xff0c;结合动作捕捉技术&#xff0c;活跃于品牌线上线下营销活动场景&#xff0c;让吉祥物虚拟主持人凭借其“萌”、的特征&#xff0c;带给用户亲近感&#xff0c;快速拉近品牌与用户的距离&a…

CRM管理系统选择技巧-六大步骤助您选择好用的客户管理系统

毫无疑问&#xff0c;一个好的CRM管理系统是任何成长型企业的必备条件。然而&#xff0c;为您的企业选择合适的CRM系统并不容易。打开搜索引擎&#xff0c;有非常多的结果&#xff0c;怎样在数十万个搜索结果中选择适合您的CRM系统&#xff1f;CRM选型要按照明确自身需求、决定…

CentOS stream 9最小化安装说明

Server with GUI&#xff1a;An integrated , easy-to-manage server with a graphical interface. 带有图形用户界面的服务器&#xff1a;集成、易于管理的服务器&#xff0c;带有图形界面。Server&#xff1a;An integrated , easy-to-manage server. 服务器&#xff1a;集成…

计算机毕业设计-----SSH在线电影售票选座版网站平台系统

项目介绍 本项目为前后台项目&#xff0c;首先分为管理员和普通用户&#xff0c;游客。 游客可以进入首页&#xff0c;必须注册成为普通用户才能进行影片的购买。管理员和普通用户进行分权限登录&#xff0c;登录后进入不同页面。 普通用户登录后进入首页&#xff0c;首页有影…

大数据Doris(五十五):SQL函数之日期函数(三)

文章目录 SQL函数之日期函数(三) 一、SECOND(DATETIME date)

项目乱、管控难?低代码CRM+助力广告行业数字化运营

广告行业涉及的是多环节、多角色、把控难的复杂项目&#xff0c;传统的广告行业普遍存在客户资源分散、项目协同难、账目不清晰、数据信息滞后等问题。 基于广告行业场景痛点&#xff0c;道一云结合七巧低代码开发平台&#xff0c;打造了广告行业CRM解决方案&#xff0c;围绕销…

K8S--service

一、简介 Service 是将集群中的 一个或一组 Pod应用程序公开为网络服务的方法。我们都知道pod是不稳定的,有可能时时刻刻都在创建和销毁,这一时刻运行的 Pod 集合可能不同于下一刻运行该应用的 Pod 集合,并且新创建的pod的ip地址会改变,所以我们不应该寄期望于pod的稳定性…

直观智慧:数据可视化如何成为我们日常决策的得力助手

数据可视化&#xff0c;作为信息时代的一项强大技术&#xff0c;不仅改变了我们对数据的理解方式&#xff0c;更在日常生活中悄然发挥着深远的作用。下面我就以可视化从业者的角度来简单说说这个话题。 在这个信息爆炸的时代&#xff0c;我们每天都面对着大量的数据。传统的数据…

苹果Safari怎么清理缓存?很简单,学会这两招够了!

Safari是一款由苹果公司开发的多功能浏览器&#xff0c;以其快速、稳定和安全而受到用户的青睐。在我们使用Safari时&#xff0c;它会产生大量的缓存文件。 这些缓存文件会占用存储空间&#xff0c;影响设备的运行速度。那么&#xff0c;safari怎么清理缓存呢&#xff1f;本文…

【数据结构 】哈夫曼编译码器

数据结构-----哈夫曼编译码器 题目题目描述基本要求算法分析 代码实现初始化编码解码打印代码打印哈夫曼树 总结 题目 题目描述 利用哈夫曼编码进行信息通信可大大提高信道利用率&#xff0c;缩短信息传输时间&#xff0c;降低传输成本。 要求&#xff1a;在发送端通过一个编…

CRM的销售管道是什么?有哪些应用价值?

常常阅读CRM管理系统相关内容的朋友会发觉&#xff0c;这些文章中总会提及一个词——【销售管道】。销售管道是一种重要的销售工具&#xff0c;是营销过程的可视化表达。销售管道清晰地叙述了业务状态&#xff0c;例如商机处在哪个阶段/哪些是更高效的销售活动。销售管道为企业…

操作系统(复习提纲)

现在距离操作系统考试还剩三天&#xff0c;我今天刚刚整理好这份提纲&#xff0c;里面还附加了一些可能考的计算题的讲解视频&#xff0c;都是B站上一些优秀的UP主录制的&#xff0c;我觉得讲的还挺好的&#xff0c;对于应付考试&#xff0c;以不挂科为宗旨应该可以哈哈哈。 1…

爬虫案例—抓取豆瓣电影的电影名称、评分、简介、评价人数

爬虫案例—抓取豆瓣电影的电影名称、评分、简介、评价人数 豆瓣电影网址&#xff1a;https://movie.douban.com/top250 主页截图和要抓取的内容如下图&#xff1a; 分析&#xff1a; 第一页的网址&#xff1a;https://movie.douban.com/top250?start0&filter 第二页的…

五、程序流程结构(2)循环结构——while语句

作用&#xff1a; 满足循环条件&#xff0c;执行循环语句 语法&#xff1a; while(循环条件){循环语句}; 解释&#xff1a;只要循环条件的结果为真&#xff0c;就执行循环语句 1、循环打印0-9 #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<strin…