How is this HashSet producing sorted output?

前端 未结 5 1677
旧巷少年郎
旧巷少年郎 2020-11-30 12:45

The following code produces the out put [1,2]even though hashset is not sorted.

Set set = new HashSet();
set.add(new Integer(2));
set.add(new In         


        
5条回答
  •  醉酒成梦
    2020-11-30 13:37

    EDIT: As of Java 8 and later, the following is no longer applicable. This proves that you shouldn't rely on undocumented Java behaviours.


    This behaviour is caused by several separate reasons:

    • Integers hash to themselves
    • in Java, HashMaps and HashSets are backed up by an array
    • they also modify hashes using the higher bits to modify the lower bits; if the hash is in range 0..15, it's therefore not modified
    • what bucket an object goes depends on the lower bits of the modified hash
    • when iterating over a map or a set, the inner table is scanned sequentially

    So if you add several small (<16) integers to a hashmap/hashset, this is what happens:

    • integer i has hashcode i
    • since it's less than 16, it's modified hash is also i
    • it lands in the bucket no. i
    • when iterating, the buckets are visited sequentially, so if all you stored there are small integers, they will be retrieved in ascending order

    Note that if the initial number of buckets is too small, the integers may land in buckets not numbered after them:

    HashSet set = new HashSet<>(4);
    set.add(5); set.add(3); set.add(1);
    for(int i : set) {
      System.out.print(i);
    }
    

    prints 153.

提交回复
热议问题