Java 哈希集和树集

标签 java hashset treeset

我有一个问题。它说 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不维护顺序,但它必须在打印时按某种顺序遍历元素。 HashSetHashMap 支持,它按照存储元素的 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/

相关文章:

java - 如何在UML中表示一个类在发布spring事件时调用另一个类的方法

java - 从 Java 中的 LinkedList 构造函数实例化 List

java - 何时使用 Jersey 的 @Singleton 注释?

java - 将逗号分隔的字符串转换为 HashSet

Java TreeSet 按值对对象进行排序

java - FreeMarker 模板中的枚举错误

java - JDK 8 处理 HashMap 冲突的新策略(树而不是列表)是否只适用于那些无法编写好的 hashcode() 的人?

java - 无法将元素添加到哈希集的顶部

java - 树集的性能问题#add

java - TreeMap 按值排序错误