Java Hashset根据值而不是hashcode存储项目

时间:2018-05-02 12:59:47

标签: java hash

HashSet hs = new HashSet();
hs.add(1000);
hs.add(new Integer(1000));
System.out.println(hs);

上面的代码打印[1000],但是我使用了new运算符,它将在内存中创建一个新对象,因此哈希代码必须不同,所以它是否应该在hashset中有两个值?

3 个答案:

答案 0 :(得分:4)

  

我使用了new运算符,它将在内存中创建一个新对象,因此哈希码必须是不同的

这个假设是不正确的。默认的hashCode实现为不同的实例返回不同的哈希值,但这不是必需的。在许多情况下,您实际上希望不同的实例返回相同的hashCode(从实例成员计算),以便能够比较实例是否相等。

来自Integer hashCode的文档:

  

返回:此对象的哈希码值,等于此Integer对象表示的原始int值。

如果您确实想要一个不使用equals / hashCode的地图,请查看IdentityHashMap类。

答案 1 :(得分:0)

Integer的hashcode()方法返回对象的哈希码值,该值等于内部存储的原始int值,在您的情况下为1000.

答案 2 :(得分:0)

为了更好地理解它,让我们做一个小测试,让我们找到这种情况的hashCode:

int     i1 = 1000;
Integer i2 = 1000;
Integer i3 = new Integer(1000);

System.out.println(Integer.valueOf(i1).hashCode());
System.out.println(i2.hashCode());
System.out.println(i3.hashCode());

所有情况都返回相同的hashCode。

<强>输出

1000
1000
1000

为此,您在Set中获得一个值,而不是像预期的那样获得两个值。