簡體   English   中英

為什么打印兩次“ tostring”?

[英]why does it print “tostring” twice?

這是我的課,請解釋為什么它兩次打印“ 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()調用?

不要在toString()方法中進行System.out.println(...)調用,因為這沒有任何意義。 此方法的目標不是打印字符串,而是返回字符串,調用者可以隨后決定該字符串做什么,包括打印出來或在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的鍵,則將調用該方法。 檢查集合中的相等性時也使用它(我相信),但是請測試您的代碼以查看何時和何處使用它。 還可以通過使hashCode返回非0值來使hashCode更加有用,該值取決於類的鍵字段的狀態,即equals方法測試中使用的相同字段。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM