我有一个问题。它说 java 中的 hashset 不维护订单,而是查看我的程序
public static void main(String[] args) {
HashSet<Integer> io=new HashSet<Integer>();
Integer io1=new Integer(4);
Integer io2=new Integer(5);
Integer io3=new Integer(6);
io.add(io2);
io.add(io3);
io.add(io1);
System.out.println(io);
}
并执行它,每次我运行它时都会给我一个有序集。为什么会这样?
另一个问题是:如果我实现一个树集(就像我在之前的程序中所做的那样,而不是使用树集的哈希集和使用我的类的 Integer 的整数)我必须实现 compareto ?
最佳答案
HashSet
不维护顺序,但它必须在打印时按某种顺序遍历元素。 HashSet
由 HashMap
支持,它按照存储元素的 bin 的顺序遍历元素。在您的简单示例中,4、5、6 映射到 bin 4、5、6(因为整数的 hashCode 是整数的值),因此它们按升序打印。
如果您尝试添加 40、50、60,您会看到不同的顺序 ([50, 40, 60]
),因为默认的初始 bin 数量为 16,因此哈希码 40、50、60 将映射到 bin 40 %16 (8),50%16 (2) ,60%16 (12),所以50是第一个被迭代的元素,接着是50和60。
至于TreeSet<SomeCostumClass>
,您可以实现 Comparable<SomeCostumClass>
在 SomeCostumClass
,或传递 Comparator<SomeCostumClass>
给构造函数。
关于Java 哈希集和树集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38745305/