为什么不在线程上使用equals()方法?

时间:2018-01-14 14:52:57

标签: java equals java-threads

public class Test {
    public static void main(String[] args) {
        Thread t1 = new Thread();
        Thread t2 = new Thread();
        Thread t3 = t1;

        String s1 = new String();
        String s2 = new String();

        System.out.println(t1 == t3);  //true
        System.out.println(t1 == t2);  //false

        **System.out.println(t1.equals(t2));  //false**
        System.out.println(s1.equals(s2)); //true
    }
}

众所周知,Object.equals()方法用于检查内容而不是引用。因此,当您创建两个线程并对它们执行equals()时,究竟发生了什么?

我认为线程的工作方式不同。 (我是初学者)

它们如何运作?

1 个答案:

答案 0 :(得分:1)

您似乎误解了equals的作用。

我想您已经了解到equals可以用于逐个字符地比较字符串,而不是通过它们的引用来比较它们。然后你想,好吧,所以equals可以比较这样的东西!

然后,你认为这两个线程是相同的:

Thread t1 = new Thread();
Thread t2 = new Thread();

"因为看!它们以相同的方式创建 - 使用new Thread()。所以它们应该是equal!"你想。

但是,equals并不认为两个线程是相同的。事实上,Thread甚至不会覆盖equalsString)!因此,它使用来自其超类equals的{​​{1}}实现,它比较了引用。

因此,Object不像某些神奇的"比较对象"逻辑上"的东西。它必须在子类中重写。它并不总是在你想要的地方工作。

另一个例子是equals,它也不会覆盖Scanner

equals

Scanner s1 = new Scanner("Hello"); Scanner s2 = new Scanner("Hello"); System.out.println(s1.equals(s2)); // false s1具有完全相同的要扫描的字符串,它们与字符串的位置完全相同,但在将它们与s2进行比较时它们并不相同。< / p>