注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

民主与科学

独立之人格,自由之思想

 
 
 

日志

 
 

HashSet  

2011-11-15 17:48:55|  分类: JAVA集合容器 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
 java.util.HashSet类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证集合的迭代顺序;
 特别是它不保证该顺序恒久不变。此类允许使用 null 元素。
 此类为基本操作提供了稳定性能,这些基本操作包括 add、remove、contains 和 size,
 假定哈希函数将这些元素正确地分布在桶中。对此集合进行迭代所需的时间与 HashSet 实例的大小( 元素的数量)
 和底层 HashMap 实例(桶的数量)的“容量”的和成比例。因此,如果迭代性能很重要,
 则不要将
初始容量设置得太高(或将加载因子设置得太低)。
 此实现不是同步的。 如果多个线程同时访问一个集合,而其中至少一个线程修改了该集合,
 那么它必须 保持外部同步。这通常是通过对自然封装该集合的对象执行同步操作来完成的。
 如果不存在这样的对象,则应该使用 Collections.synchronizedSet 方法来“包装”集合。
 最好在创建时完成这一操作,以防止对 HashSet 实例进行意外的不同步访问:
     Set s = Collections.synchronizedSet(new HashSet(...));
 此类的 iterator 方法返回的迭代器是快速失败 的:在创建迭代器之后,如果对集合进行修改,
 除非通过迭代器自身的 remove 方法,否则在任何时间以任何方式对其进行修改,
 Iterator 都将抛出 ConcurrentModificationException。因此,面对并发的修改,迭代器很快就会完全失败,
 而不冒将来在某个不确定时间发生任意不确定行为的风险。
 迭代器的快速失败行为无法得到保证,因为一般来说,不可能对是否出现不同步并发修改做出任何硬性保证。
 快速失败迭代器在尽最大努力抛出 ConcurrentModificationException。因此,为提高这类迭代器的正确性而编写一个依赖于此异常的程序是错误做法:
 迭代器的快速失败行为应该仅用于检测程序错误。
构造函数
Public Constructors
HashSet()
Constructs a new empty instance of HashSet.
HashSet(int capacity)
Constructs a new instance of HashSet with the specified capacity.
HashSet(int capacity, float loadFactor)
Constructs a new instance of HashSet with the specified capacity and load factor.
HashSet(Collection<? extends E> collection)
Constructs a new instance of HashSet containing the unique elements in the specified collection.
 注意1:因为使用的是哈希表(实际上是一个 HashMap 实例),所以容量很大,几乎无界。
 注意2:实现不同步的,不是线程安全的。
 注意3:允许使用null元素。但是最多一个。
 注意4:此类的 iterator 方法返回的迭代器是快速失败 的:在创建迭代器之后,如果对集合进行修改,
 除非通过迭代器自身的 remove 方法,否则在任何时间以任何方式对其进行修改,
 Iterator 都将抛出 ConcurrentModificationException。
 注意5:HashSet能快速定位一个元素,但是你放到HashSet中的对象需要实现 hashCode()方法。
 注意6:如果两个元素的hashCode()方法返回一样,仍然可以正常工作。
 只有hashCode()方法返回一样的情况下才用equals判断两个元素。如果相等,则后面的元素无法加进去。
 注意7:如果对已经加入HashSet的两元素,做修改使hashCode()相等且e1.equals(e2)。好像并没有什么影响。
 但是参照Set的说”那么 set 的行为就是不确定的“,所以应避免此操作。
 注意8:关于HashSet判断对象相等的更多知识请参考《hashcode()和equals()及HashSet判断对象相等

  评论这张
 
阅读(1011)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017