this.toString()什么时候可能会返回一个重复的字符串?
public static void main(java.lang.String s[]) {
for(int i=0;i<155000;i++) {
new Thread(new Runnable() {
public void run() {
System.out.println(this.toString());
}
}).start();
}
}
答案 0 :(得分:7)
Thomas的答案是正确的,因为Object
的默认toString()
方法将被调用,为不同的对象生成不同的String
。
有一点需要注意。 Object.toString()
返回:
return getClass().getName() + "@" + Integer.toHexString(hashCode());
它包括Object.hashCode()
。 hashCode()的Javadoc声明:
...类
Object
定义的hashCode方法确实为不同的对象返回不同的整数 ...
关键是不同对象的hashCode()
会有所不同。由于您的代码不存储创建的Runnable
,因此一旦Thread
完成,它们将被垃圾收集。一旦从内存中删除了一个对象,另一个Object
可能会在内存中占据一席之地,新的Runnable
可能会提供前一个Runnable
返回的相同哈希码。现在停止存在。
所以从理论上讲,你可能会看到同样的String
不确定地印刷(尽管机会很小)。
答案 1 :(得分:4)
由于toString()
默认只返回类和对象id,因此在任何情况下都不应该有重复项。您基本上创建了155k个不同的Runnable
匿名实例(以及Thread
)。
答案 2 :(得分:2)
来自doc:类toString()
的{{1}}方法返回一个字符串,该字符串由对象为实例的类的名称,at符号字符“@”和对象的哈希码的无符号十六进制表示。换句话说,此方法返回一个等于值的字符串:
Object
您使用的 getClass().getName() + '@' + Integer.toHexString(hashCode())
方法属于toString()
类。正如您所看到的,它涉及hashCode,因此它永远不会打印重复值,前提是您之前的Object
的所有实例仍然是 IN 内存。