为什么在这个例子中调用hashcode?

时间:2011-06-28 16:41:15

标签: java hashcode

有人可以解释为什么在下面的示例中调用hashCode

import java.util.List;

public class JSSTest extends Object{

    public static void main(String args[]){

        JSSTest a = new JSSTest();
        JSSTest b = new JSSTest();
        List<JSSTest> list = new java.util.ArrayList<JSSTest>();
        list.add(a);
        list.add(b);
        System.out.println(list.get(0));
        System.out.println(list.get(1));
    }

    @Override
    public boolean equals(Object obj){
        System.out.println("equals");
        return false;
    }

    @Override
    public int hashCode(){
        System.out.println("hashCode");
        return super.hashCode();
    }
}

结果:

hashCode 0
JSSTest@1bab50a
hashCode 0
JSSTest@c3c749

3 个答案:

答案 0 :(得分:15)

默认toString()实施调用hashCode。这与列表无关。

这是一个相当小的复制品:

public class JSSTest {

    public static void main(String args[]){
        JSSTest test = new JSSTest();
        // Just to show it's not part of creation...
        System.out.println("After object creation");
        test.toString();
    }

    @Override
    public boolean equals(Object obj){
        System.out.println("equals");
        return false;
    }

    @Override
    public int hashCode(){
        System.out.println("hashCode");
        return super.hashCode();
    }
}

(您可以覆盖toString()以显示在/超级电话/详细信息之后。)

它记录在Object.toString()

  

类Object的toString方法返回一个字符串,该字符串由对象为实例的类的名称,符号字符“@”和对象的哈希码的无符号十六进制表示组成。换句话说,此方法返回一个等于值的字符串:

getClass().getName() + '@' + Integer.toHexString(hashCode())

答案 1 :(得分:7)

System.out.println(list.get(0));

我相信它是Object.toString()方法的一部分,除非你在自己的类中覆盖toString(),否则所有对象都有。试试看,然后看看。

答案 2 :(得分:6)

因为toString()中的Object实现调用它..

 public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

覆盖toString,不会被称为