HashSet实现了Set接口,由hash表支持(实际上是一个HashMap的实例)。HashSet不保证集合的迭代顺序;特别是不保证顺序恒久不变。允许使用null元素。
HashSet为基本操作提供了稳定的性能,这些操作包括add(),remove(),contains()和size(),假定hash函数已经将这些元素正确地分布在桶中。对集合进行迭代所需的时间与与HashSet实例的大小(元素的数量)和底层HashMap的实例的“容量”的和成正比。因此,如果HashSet迭代的性能很重要,财不要将初始容量设置得太高(或将加载因子设置得太低)。在生成HashSet对象时可以设置初始容量,如Set hset = new HashSet(10,0.3),则生成的HashSet对象的初始容量为10,加载因子为0.3。默认构造函数的初始容量是16,加载因子是0.75。
注意,这个实现不是同步的。 如果多个线程同时访问一个HashSet集合,而其中至少有一个线程修改了该集合,那么它必须同外部保持同步。
这通常是通过对自然封装该集合的对象执行同步操作来完成的。如果不存在这样的对象,则应该使用 Collections.synchronizedSet 方法来“包装”集合。最好在创建时完成这一操作,以防止对 HashSet 实例进行意外的不同步访问:
Set s = Collections.synchronizedSet(new HashSet(...));
此类的 iterator 方法返回的迭代器是快速失败 的:在创建迭代器之后,如果对集合进行修改,除非通过迭代器自身的 remove 方法,否则在任何时间以任何方式对其进行修改,Iterator 都将抛出 ConcurrentModificationException 。因此,面对并发的修改,迭代器很快就会完全失败,而不冒将来在某个不确定时间发生任意不确定行为的风险。
注意,迭代器的快速失败行为无法得到保证,因为一般来说,不可能对是否出现不同步并发修改做出任何硬性保证。快速失败迭代器在尽最大努力抛出 ConcurrentModificationException 。因此,为提高这类迭代器的正确性而编写一个依赖于此异常的程序是错误做法:迭代器的快速失败行为应该仅用于检测程序错误。
HashSet类里有一个transient的私有map,构造函数中对这个map进行初始化:
public HashSet() { map = new HashMap<E,Object>(); } public HashSet(int initialCapacity, float loadFactor) { map = new HashMap<E,Object>(initialCapacity, loadFactor); }
从HashSet的构造函数可以看出,HashSet的底层其实是使用了HashMap,使用HashMap实例进行对集合的元素进行操作,然后再封装成HashSet的操作。
相关推荐
源码解析jdk7.0集合:HashSet的底层实现原理.pdf
主要介绍了hashset去除重复值原理实例解析,具有一定借鉴价值,需要的朋友可以参考下。
主要介绍了HashSet和TreeSet使用方法的区别解析,具有一定借鉴价值,需要的朋友可以参考下
java所有集合类底层源码解析汇总,包括ArrayList、HashMap、HashSet、LinkedList、TreeMap、HashSet、ConcurrentHashMap等集合框架的底层实现源码大白话解读。
ed2k-link 一个简单的模块,用于解析/生成nodejs的ed2k链接。 安装 您可以使用以下命令进行安装: npm install ed2k-link ... hashset : [ ] , sources : { client : [ ] , url : [ ] } , length : 123
HTML解析实用库,非常好用 public class HtmlLinkParser { //获取子链接,url为网页url,filter是链接过滤器,返回该页面子链接的HashSet public static Set<String> extracLinks(String url, LinkFilter filter...
import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashSet; import java.util.List; import java.util.Properties; import java.util.Set; import java.util.regex.Matcher; import ...
office_poi 解析JSON包 解析XML包 上传下载(cos,jspsmartupload) 数据库连接(SQL Server,Oracle,MySQL) 数据库连接池(c3p0) mp3spi
本篇文章是对Java线程同步锁的选择方法进行了详细的分析介绍,需要的朋友参考下
HashMap LinkedList ArrayList HashSet SortedSet Socket Thread OutputStream InputStream 指令支持 通用指令 keys pattern 支持正则匹配 expire key mill del key [key...] string set key value get key list ...
常用集合底层原理深度解析,包括arraylist,hashmap,hashset,linkedarrayList,面试必备!
Set< RpslObject> objectSet = new HashSet<> () :RpslObjectStringReader rpslReader = new RpslObjectStringReader (rpslDocumentString);for ( String objStr : rpslReader) objectSet . add( RpslObject . ...
本文将对Java常见面试题进行总结和解析,旨在为准备面试的Java开发者提供全面而深入的学习参考。以下是一些关键的Java面试题目类别及其概述: Java集合框架:这部分问题关注ArrayList、LinkedList、HashMap、HashSet...
java8 集合源码分析 java基础复习 [TOC] 一、集合 1.Iterator 2.Collection 2.1 List--->有序、有索引、元素可重复 ...有序,是HashSet的子类 2.TreeSet: 底层是二叉树,可对元素进行排序,默认是自然顺序
数据结构java队列——queue详细解析Queue:先进先出(FIFO)的数据结构。与List、Set同一级别,都是继承了Collection接口。LinkedList、ConCurrentLinkedQueue、LinkedBkockingQueue对比分析存储无序不重复的值对象的...
它具有诸如爬网程序,索引编制,解析,拼写检查和查询建议之类的功能。 这些概念用于开发此Web搜索引擎倒排索引TST(三元搜索Trie)用于存储索引文档词频-反向文档频率,用于衡量一个单词相对于其他文档而言有多...
拼写检查器该知识库包含哥伦比亚大学课程中有关哈希集的... 对象的构造函数必须(本身或通过调用其他方法)解析字典文件,并将单词存储在HashSet实例中。 public SpellChecker(String filename) -这是您的构造函数。
什么是XML解析器活动与片段类与结构投掷vs投掷vs Throwable 字符串vs StringBuffer vs StringBuilder HashSet与HashMap 错误v异常CheckedException与未检查的异常。 解释OOPS概念。 没有OOPS的概念,可以上任何课。...
对象的构造函数必须(本身或通过调用其他方法)解析字典文件,并将单词存储在HashSet实例中。 public SpellChecker(String filename) -这是您的构造函数。 它应采用字典文件名的字符串。 您可能需要引发一个异常,...
删除链表中重复的节点[无序的情况下-HashSet] 二. Notes for Android Heros 三. Notes for Arts of Android Dev 本章介绍 View 的基本概念和 View 的滑动相关知识以及关于 View 的事件分发机制实例和源码解析。 本篇...