hashset java 键值对_Java集合 - HashSet的定义以及用法

HashSet的定义

HashSet类实现了Set接口,由一个实际上是HashMap实例的散列表​支持。不能保证该集合的迭代次序,这意味着该类不能保证元素随时间的不变顺序。这个类允许null元素。该类还为基本操作(如添加,删除,包含和大小)提供了恒定的时间性能,假定散列函数将元素正确地分散到桶中,我们将在文章中进一步讨论。
HashSet的一些重要特性是:

  • 实现Set Interface。
  • HashSet的基础数据结构是散列表。
  • 由于它实现了Set Interface,所以不允许重复值。
  • 您在HashSet中插入的对象不保证以相同顺序插入。对象基于其哈希码插入。
  • HashSet中允许使用NULL元素。
  • HashSet还实现了Searlizable和Cloneable接口。
04d5de06248c715d6c9b2b6609b5a18a.png

现在为了维持恒定的时间性能,迭代HashSet需要的时间与HashSet实例的大小(元素数量)加上支持HashMap实例的“容量”(桶的数量)的总和成正比。因此,如果迭代性能很重要,不要将初始容量设置得太高(或者负载因子太低)是非常重要的。

初始容量:初始容量意味着在创建散列表(HashSet内部使用散列表数据结构)时创建桶的数量。如果当前尺寸变满,桶的数量将自动增加。负载因数:负载因数是衡量HashSet在其容量自动增加之前能够获得的满量程。当哈希表中的条目数量超过负载因子和当前容量的乘积时,散列表就会被重新映射(即重建内部数据结构),以便散列表大约是存储桶数量的两倍。

                  表格中存储的元素数量   加载因子= -----------------------------------------                        散列表的大小 

示例:如果内部容量为16并且加载因子为0.75,那么当表中有12个元素时,桶的数量会自动增加。

对性能的影响:
负载因子和初始容量是影响HashSet操作性能的两个主要因素。0.75的负载因子在时间和空间复杂度方面提供了非常有效的性能。如果我们将负载因子值增加得超过这个值,那么内存开销将会减少(因为它会减少内部重建操作),但是它会影响哈希表中的添加和搜索操作。为了减少重新哈希操作,我们应该明智地选择初始容量。如果初始容量大于最大入口数量除以负载因子,则不会发生重新刷新操作。

注:HashSet中的实现不同步,因为如果多个线程同时访问散列集,并且至少有一个线程修改了该集,它必须在外部同步。这通常是通过在自然封装集合的某个对象上进行同步来完成的。如果不存在这样的对象,则应该使用Collections.synchronizedSet方法来“包装”该集合。这最好在创建时完成,以防止意外的不同步访问集合,如下所示:

Set s = Collections.synchronizedSet(new HashSet(...));

HashSet中的构造函数:

  1. HashSet h = new HashSet();
    默认初始容量为16,默认加载因子为0.75。
  2. HashSet h = new HashSet(int initialCapacity);
    默认的0.75的loadFactor
  3. HashSet h = new HashSet(int initialCapacity,float loadFactor);
  4. HashSet h = new HashSet(Collection C);

下面的程序说明了HashSet的几个基本操作:

// Java program to demonstrate working of HashSet

import java.util.*;

class Test

{

public static void main(String[]args)

{

HashSet h = new HashSet();

// Adding elements into HashSet usind add()

h.add("India");

h.add("Australia");

h.add("South Africa");

h.add("India");// adding duplicate elements

// Displaying the HashSet

System.out.println(h);

System.out.println("List contains India or not:" +

h.contains("India"));

// Removing items from HashSet using remove()

h.remove("Australia");

System.out.println("List after removing Australia:"+h);

// Iterating over hash set items

System.out.println("Iterating over list:");

Iterator i = h.iterator();

while (i.hasNext())

System.out.println(i.next());

}

}

输出:

[South Africa, Australia, India]List contains India or not:trueList after removing Australia:[South Africa, India]Iterating over list:South AfricaIndia

HashSet的内部工作
由Map内部备份的所有Set接口类。HashSet使用HashMap在内部存储它的对象。您一定想知道,要在HashMap中输入值,我们需要一个键值对,但在HashSet中,我们只传递一个值。

存储在HashMap中
实际上,我们在HashSet中插入的值作为映射对象的关键字,并且其值java使用常量变量。所以在键值对中,所有键都具有相同的值。

在java文档中实现HashSet

private transient HashMap map;//构造函数 -  1//所有的构造函数都在内部创建HashMap对象。public HashSet(){    //创建内部支持HashMap对象    map = new HashMap();}//构造函数 -  2public HashSet(int initialCapacity){    //创建内部支持HashMap对象    map = new HashMap(initialCapacity);}//与map中的对象关联的虚拟值private static final Object PRESENT = new Object();

如果我们看一下HashSet类的add()方法:

public boolean add(E e){   return map.put(e,PRESENT)== null;}

我们可以注意到,HashSet类的add()方法通过传递指定的元素作为键和常量“PRESENT”作为其值,来内部调用支持HashMap对象的put()方法。

remove()方法也以相同的方式工作。它内部调用Map接口的remove方法。

public boolean remove(Object o){  return map.remove(o)== PRESENT;}

HashSet操作的时间复杂度:HashSet的基础数据结构是散列表。因此,对于添加,移除和查找(包含方法)操作,HashSet需要O(1)次的时间复杂度(平均或通常情况下)的时间复杂度。

HashSet中的方法:

  1. boolean add(E e):用于添加指定元素(如果不存在),如果存在则返回false。
  2. void clear():用于删除set中的所有元素。
  3. boolean contains(Object o): 如果元素存在于set中,则返回true。
  4. boolean remove(Object o):用于删除元素,如果它存在于set中。
  5. Iterator iterator(): 用于返回集合中元素的迭代器。
  6. boolean isEmpty():用于检查集合是否为空。返回true表示空,false表示非空条件。
  7. int size():用于返回集合的大小。
  8. Object clone():用于创建集合的浅表副本。

--------------------------------------------------------

转载自:https://www.breakyizhan.com/java/4658.html

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

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

相关文章

计算机对口高考文化试卷,计算机对口高考模拟试卷

计算机对口高考模拟试卷 (9页)本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦!9.9 积分2011-2012第一学年对口计算机期中试卷一、选择题(每题2分,共50分) 下列各组设备中,全部属…

delve 调试带参数_带你学够浪:Go语言基础系列-环境配置和 Hello world

前面几周陆陆续续写了一些后端技术的文章,包括数据库、微服务、内存管理等等,我比较倾向于成体系的学习,所以数据库和微服务还有后续系列文章补充。最近工作上比较多的 Golang 编程,现在很多互联网公司都在转向 Golang 开发&#…

语音 视频 质量测试软件,DxOMARK官方发布视频,了解如何测试手机音频质量

IT之家10月11日消息 北京时间昨日晚间,DxOMARK正式推出了手机音频评分系统DXOMARK Audio,官方也发布视频告诉大家DXOMARK如何测试手机音频质量。视频中展示了录制环节,包括自拍视频、语音消息、播放视频、游戏、播放音乐等。通过三个步骤测试…

计算机拆卸组装过程,如何拆卸并重新组装笔记本电脑

如何拆卸并重新组装笔记本电脑当您的笔记本电脑需要更换、升级硬件或者清理内部灰尘时,您需要知道如何进行拆卸并重装,跟着本文一起了解是如何进行的吧。详细了解如何安全处理旧组件或笔记本电脑。拆卸笔记本电脑本文只是通用性的拆卸指南,具…

登录服务器用户账户限制,当用户有登录到的限制时,远程桌面登录报错的解决...

------老朱 2015.3.6一客户对普通域用户能够登录到的计算机有着严格的限制,即在用户账户中进行了登录到的设置,比如张三只能登录到张三的电脑,但对服务器账户没有限制,现在准备限制服务器账户能够登录到的服务器,按原来…

js在wap端获取定位_iPhone 定位服务,没用的都关掉

iOS 13 系统带来了很多新功能,同时对用户的隐私保护也进行了再度加强和优化。比如和用户隐私息息相关的定位服务,苹果在「始终」和「永不」之外,又加入了「使用 App 期间」这个更人性化的选项,应用只有在使用期间才会获取你的位置…

服务器系统日志6008,DELL服务器宕机事件6008

在DELL服务器上安装了windows server 2008 r2 64位标准版,客户在该操作系统上安装了自己开发的视频监控软件。服务器在运行一段时间后,会出现如下情况:(事件ID6008)1。机器硬件没有报错,但是无法Ping通,不能登录远程桌…

java 获取内存大小_JVM面试题扩展:Java代码在JVM中的执行流程

代码示例:public class Test { // 常量 public static final String MAN_SEX_TYPE "man"; // 静态变量 public static String WOMAN_SEX_TYPE "woman"; public static void main(String[] args) { People people …

idea数据库反向生成实体类_asp.net core 系列 21 EF现有数据库进行反向工程

一.概述在上篇中使用EF基于数据模型创建数据库, 本篇继续使用 EF 基于数据库创建数据模型。 实现对已有数据库进行反向工程,来构建数据访问的 ASP.NET Core MVC 应用程序。已有数据库使用上篇的EFGetStarted.AspNetCore.NewDb库。这里还是使用Visual Stu…

名爵如何解除限速_价格不高却乐趣十足,全新一代名爵6有多大惊喜

紧凑型轿车市场一直是各大车企的兵家必争,激烈的市场竞争也促成了很多紧凑型级别的细分市场,而紧凑型运动轿车则一直是消费者最为关注的一类产品。全新一代名爵6究竟有着什么表现,它能否在激烈竞争中取胜,运动调校上又有何等功底&…

管理服务器文件绿色版本,Services.msc服务器文件官方版

Services.msc是一款能够让我们对Windows系统服务策略进行快速管理和处理的工具,主要用于是适应于启动、终止并设置Windows服务的管理策略,该文件使用也是比较简单,软件简单又实用,让我们对相关进行快速管理,有需要的朋…

e2140服务器性能,4000 还是E2140?两大人气CPU对决

4000 还是E2140?两大人气CPU对决互联网 发布时间:2009-04-21 01:31:37 作者:佚名 我要评论今夏攒机,双核处理器无疑是网友们的第一选择。由于Intel和AMD的大力推广,双核处理器的价格目前已经跌到了一个大众消费…

12306能删候补订单记录_「实用」官方“捡漏”神器来了!12306铁路候补购票服务正式上线!...

准备购买火车票的小伙伴注意啦!中国铁路总公司说,5月22日起,铁路12306网站(含手机客户端)在前期试点的基础上,将铁路候补购票服务扩大到所有旅客列车。候补购票如何操作?怎么提交订单?如何添加“车次席别”…

联想平板刷机机器人_消费终端年出货量破1.2亿,杨元庆:联想是智能化转型的赋能者...

“科技是我们‘在危机中育先机、于变局中开新局’可以依赖的力量。联想一直在用实际行动为推动‘智慧经济’的增长,为构建“双循环”的新发展格局做贡献。”文丨《中国企业家》记者 刘哲铭编辑丨李薇图片来源丨中企图库一座青砖黑瓦的古城里,绿水萦回&am…

查询已有链表的hashmap_面试官再问你 HashMap 底层原理,就把这篇文章甩给他看...

前言HashMap 源码和底层原理在现在面试中是必问的。因此,我们非常有必要搞清楚它的底层实现和思想,才能在面试中对答如流,跟面试官大战三百回合。文章较长,介绍了很多原理性的问题,希望对你有所帮助~目录本篇文章主要包…

js 获取url问号前_收下这波 JS 技巧,从此少加班

各种业务开发都离不开对数据的处理,然而遇到的很多数据都是不好处理的。这个时候就需要寻求搜索引擎的帮助。这种方法效率是非常低下的,而且根据作者的个性不能保证其对自己的口味。因此这篇文字包含了一份JS 常用业务函数手册,例如时间格式的…

底层实现_Java AOP的底层实现原理

AOP用于处理系统中分布于各个模块的横切关注点,比如事务管理、日志、缓存等。AOP实现的关键,在于AOP框架自动创建的AOP代理,AOP代理主要分为静态代理和动态代理,静态代理的代表为AspectJ;而动态代理则以Spring AOP为代…

lpv4的地址格式由多少个字节组成_我们为什么有这么多字符编码格式?

相信不少同学都在初学计算机之时,都被ASCII,Unicode和UFT-8等字符编码格式 搞得焦头烂额,这玩意儿到底是啥,区别是啥,为啥有这么多?反正我刚学的时候纯粹是囫囵吞枣,为了考试潦草背一背&#xf…

git配置用户信息_git系列教程(4)-单用户配置

一般新手都会使用一个用户,要么是github,要么是gitee本地配置上个文档已经讲过本地配置,在这里就不赘述了连接github或者gitee生成ssh公钥ssh-keygen -t rsa -C "emailexample.com" 三次会车即可生成ssh key找id_rsa.pub文件mac或…

32 引脚_函数功能:定时器T0的中断服务子程序,使P3.7引脚输出音频方波

void Time0_serve(void ) interrupt 1 using 1 {TH0(8192-C)/32; //可证明这是13位计数器TH0高8位的赋初值方法TL0(8192-C)%32; //可证明这是13位计数器TL0低5位的赋初值方法sound!sound; //将P3.7引脚取反,输出音频方波}/************************…