2015-06-05 35 views
1

我在想如何确定HashSet中元素的位置。它是通过一些内置的散列函数吗?为什么HashSet中的元素是随机顺序的?

Set <String>set=new HashSet<String>(); 
    set.add("January"); 
    set.add("February"); 
    set.add("July"); 
    set.add("August"); 
    set.add("September"); 
    set.add("October"); 
    set.add("Novermber"); 
    set.add("December"); 
    set.add("March"); 
    set.add("April"); 
    set.add("May"); 
    set.add("June"); 


    Iterator <String>it=set.iterator(); 
    while(it.hasNext()){ 
     System.out.println(it.next()); 
    } 

我得到这样的结果

June 
October 
December 
September 
May 
March 
Novermber 
July 
January 
February 
April 
August 

,这是什么订单或输出的解释?

+2

不保证它们按插入顺序排列并说它们是随机排列的。 [正如文档说的](https://docs.oracle.com/javase/7/docs/api/java/util/HashSet.html):“*它不保证集合的迭代顺序*” 。 –

+0

顺便说一句,关于你重新哈希的问题:它不是重复的,这是一个完全合法的问题。但是有很多基于散列的地图,它们的行为非常不同。 – biziclop

回答

6

HashSet基于数组。阵列中的项目索引基于hashCode()函数计算。

HashSet中的迭代器在数组元素上移动,跳过空元素。这就是为什么你的订单“很奇怪”。如果您需要保留广告订单,请使用LinkedHashSet

1

您必须支付订购费用(大多数情况下以计算时间的形式)。并且documentation明确指出,即[...]。它对集合的迭代次序没有任何保证;特别是,它不能保证订单会随着时间的推移保持不变。因此,我认为为了表现而不考虑订单。