为什么两次打印“tostring”?

时间:2014-03-10 03:18:13

标签: java

这是我的课 请解释为什么它会打印“tostring”两次

public class HashCodeAndEquals 
{
    static String asd;

    public HashCodeAndEquals(String string) {
        asd = string;
    }


    /**
     * @param args
     */
    public static void main(String[] args) {
        HashCodeAndEquals obj1 = new HashCodeAndEquals("one");
        HashCodeAndEquals obj2 = new HashCodeAndEquals("two");
        System.out.println(obj1.toString());
        //System.out.println(obj2.toString());
        System.out.println(obj1.equals(obj2));
        System.out.println(obj1==obj2);

    }


    @Override
    public String toString() {
        // TODO Auto-generated method stub
        System.out.println("tostring");
        return "tostring";
    }

    @Override
    public int hashCode() {
        // TODO Auto-generated method stub
        System.out.println("hashcode");
        return 0;
    }

}

为什么它会两次调用toString方法? 在什么时候调用哈希码 并且hashcode()调用tostring()或由toString()???

调用

1 个答案:

答案 0 :(得分:3)

System.out.println(...)方法中没有toString()来电,因为它毫无意义。此方法的目标不是打印字符串,而是打印 返回 一个字符串,然后调用代码可以决定如何处理,包括将其打印出来,或者在GUI中显示它,或者其他什么。

所以改变这个:

public String toString() {
    System.out.println("tostring");
    return "tostring";
}

到此:

public String toString() {
    return "tostring";
}

另外,System.out.println方法会自动调用它正在打印的对象上的toString(),因此不需要在method参数中显式调用它。

因此你可以改变这个:

System.out.println(obj1.toString());

更简洁:

System.out.println(obj1);

另外,您打算更改hashCode()方法,对吗?


关于,

  

在什么时候调用哈希码并且hashcode()调用tostring()或者由toString()调用?

您的程序应准确告诉您何时调用hashCode(),因为您的覆盖中包含println。如果将对象放在HashSet中或将其用作HashMap的键,则会调用它。它也用于检查集合中的相等性(我相信),但测试代码以查看它的使用时间和位置。还可以通过返回非0值来使hashCode更有用,这些值取决于类的键字段的状态,即equals方法测试中使用的相同字段。