这是我的课 请解释为什么它会打印“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()???
调用答案 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
方法测试中使用的相同字段。