Java hashCode有疑问

moo*_*sun 3 java hashcode

我有这个程序:

import java.util.*;
public class test {
    private String s;
    public test(String s) { this.s = s; }
    public static void main(String[] args) {
        HashSet<Object> hs = new HashSet<Object>();
        test ws1 = new test("foo");
        test ws2 = new test("foo");
        String s1 = new String("foo");
        String s2 = new String("foo");
        hs.add(ws1); 
        hs.add(ws2); 
        hs.add(s1); 
        hs.add(s2); // removing this line also gives same output.
        System.out.println(hs.size()); 
    } 
}
Run Code Online (Sandbox Code Playgroud)

请注意,这不是作业.我们今天早些时候在测验中被问到了这个问题.我知道答案,但试图理解为什么会这样.

上面的程序给出3作为输出.

任何人都可以解释为什么会这样吗?

我想(不确定):

java.lang.String类覆盖了hashCode从方法java.lang.Object.因此String,值为"foo" 的对象将被视为重复.测试类不会覆盖该hashCode方法并最终使用该java.lang.Object版本,并且此版本始终为每个对象返回不同的哈希码,因此添加的两个测试对象将被视为不同.

oia*_*kyi 5

在这种情况下,它不是hashCode()关于equals()方法而是关于方法.HashSet仍然是Set,其语义不允许重复.使用equals()方法检查重复项,在String的情况下将返回true

但是,对于您的testequals()方法没有定义,它将使用默认实现,Object只有当两个引用都是同一个实例时才会返回true.

方法hashCode()用于不检查对象是否应被视为相同,而是用于基于散列函数将它们分布在集合中的方式.绝对有可能对于两个对象,此方法将返回相同的值,同时equals()返回false.

PS的hashCode实现Object并不能保证值的唯一性.使用简单的循环检查很容易.