哈希排序问题

时间:2018-09-18 07:28:30

标签: java hashset treeset

最近我遇到了这个

String s = "9495963";
Set<Character> set = new HashSet<Character>();
for(char e : s.toCharArray()){
  set.add(e);
}
System.out.println(set);//[3, 4, 5, 6, 9]

我得到的输出是[3、4、5、6、9],因此,如果HashSet不保留任何顺序,那么这些数字如何以升序排列?

2 个答案:

答案 0 :(得分:7)

巧合。恰好是Character的hashCode是它的数字值。如果您继续添加的字符超过了HashSet中没有的哈希桶,则会发现它们混乱了。

答案 1 :(得分:2)

HashSet在内部使用HashMap

HashMap使用每个对象的hashCode()方法将其元素存储在哈希表中。

对于Character类,哈希码是其对应的int值。

public static int hashCode(char value) {
    return (int)value;
}

对于intdouble数据类型,它们是auto-boxedIntegerDouble类中。当您创建HashSetint时,它会使用Integer's hashCode()方法,该方法只会返回int。因此,如果您添加int,它们将按已排序的顺序存储。

但是对于double来说,Double's hashCode()方法要复杂得多,因为在内存中表示双精度的方式。

但是,随着时间的流逝,当元素超出存储桶大小时,您将看到它不会保持顺序。