HashSet hs = new HashSet();
hs.add(1000);
hs.add(new Integer(1000));
System.out.println(hs);
上面的代码打印[1000],但是我使用了new运算符,它将在内存中创建一个新对象,因此哈希代码必须不同,所以它是否应该在hashset中有两个值?
答案 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中获得一个值,而不是像预期的那样获得两个值。