日期:2014-05-20  浏览次数:20864 次

HashSet 迭代取值时顺序固定
把ArrayList中的54个值随机放入了HashSet中,为何多次编译执行时HashSet迭代取值顺序固定?set不是无序的么?
Java code

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Random;

public class HashSetDemo {
    public static void main(String[] args) {
        ArrayList<Integer> al=new ArrayList<Integer>();
        for (int i = 0; i < 54; i++) {
            al.add(i);
        }
        
        
        
        HashSet<Integer> hs=new HashSet<Integer>();
        Random rd=new Random();
        for (int i = 0; i < 54;) {
            int k=rd.nextInt(54);
            
            if(hs.contains(al.get(k))){
                continue;
            }
            hs.add(al.get(k));

            i++;
        }
        
        
        
        Iterator<Integer> it=hs.iterator();
        while(it.hasNext()){
            System.out.println(it.next());
        }
    }
}



------解决方案--------------------
只是说元素不重复而已,hashset的无序是指插入的地方我们不能控制,因为它的底层是数组根据算法来插入的,这个算法是固定的,所以每次打印出来当然是一样的啦
------解决方案--------------------
应该说HashSet是无序的,但是你往里面放入数据的规律是一样的(根据hashCode%hash桶数,而决定将该元素放到哪个桶中)