什么时候Runnable.toString()有可能返回一个重复的字符串?

时间:2014-09-01 08:02:03

标签: java runnable

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();
    }
}

3 个答案:

答案 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 内存。