为什么 equals() 方法不适用于线程?


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()时,究竟发生了什么?

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

它们是如何工作的?

你似乎误解了equals做什么。

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

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

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

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

但是,equals并不认为这两个线程是相等的。事实上,Thread甚至不会覆盖equals(String会)!因此,它使用其超类Object中的equals实现来比较引用。

因此,equals不像一些"逻辑上"比较对象的"神奇"事物。它必须在子类中被覆盖。它并不总是在您想要的地方工作。

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

Scanner s1 = new Scanner("Hello");
Scanner s2 = new Scanner("Hello");
System.out.println(s1.equals(s2)); // false

s1s2具有完全相同的字符串要扫描,并且它们与字符串的位置完全相同,但是当您将它们与equals进行比较时,它们并不相等。

最新更新