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

JSS*_*JSS 6 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

结果:

hashCode 0
JSSTest@1bab50a
hashCode 0
JSSTest@c3c749
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 15

默认toString()实现调用hashCode.这与列表无关.

这是一个相当小的repro:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

(您也可以覆盖toString()显示在/超级呼叫之前/之后的详细信息.)

它记录在Object.toString():

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

getClass().getName() + '@' + Integer.toHexString(hashCode())
Run Code Online (Sandbox Code Playgroud)


Mik*_*sen 7

System.out.println(list.get(0));
Run Code Online (Sandbox Code Playgroud)

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


Cha*_*bel 6

因为toString()执行中Object调用它..

 public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }
Run Code Online (Sandbox Code Playgroud)

覆盖toString,不会被调用