我有一个关于线程的问题,我已经搜索了解决方案,但无法澄清。 考虑我有一个Runnable类
public class MyThread implements Runnable {
String x = "";
public MyThread (String s) {
x = s;
}
public void run() {
// x = "hello";
System.out.println("runobject: "+this.hashCode());
System.out.println("runstring: "+x.hashCode());
System.out.println("x: "+ x);
}
}
我有另一个主要方法为
的类import java.util.Scanner;
public class TestThread {
public static void main (String arg[]) {
Thread t1 = new Thread(new MyThread("John"));
Thread t2 = new Thread(new MyThread("Mike"));
t1.start();
t2.start();
}
}
上面的代码将输出显示为
runobject: 33810571
runstring: 2314539
x: John
runobject: 33810633
runstring: 2398230
x: Mike
现在在theMyThread
类中,如果我在构造函数中删除x
的赋值,并在下面的run方法中引入赋值x = "hello";
public class MyThread implements Runnable {
String x = "";
public MyThread (String s) {
//x = s;
}
public void run() {
x = "hello";
System.out.println("runobject: "+this.hashCode());
System.out.println("runstring: "+x.hashCode());
System.out.println("x: "+ x);
}
}
我得到的输出是
runobject: 33810572
runstring: 99162322
x: hello
runobject: 33810634
runstring: 99162322
x: hello
注意:在第二种情况下,x变量的哈希码在两个线程中都是相同的。请解释上面的场景。为什么在第二种情况下,两个线程都引用相同的x变量并生成相同的哈希码?
提前致谢。
答案 0 :(得分:2)
字符串常量存储在缓存中。分配它时,无论在何处或何时分配它,都会从缓存中为其分配相同的String常量。
改为new String("hello")
,你会得到一个不同的字符串。
此外,hashCode
和equals
可以解除String
的值。所以无论你拥有Strings
多少String
,如果你有equals
"你好"它始终会对hashCode
和equals
做出同样的回复。这实际上是hashCode
和{{1}}的用途 - 快速找到具有相同价值的内容。