class A
{
static String lock1 ="mylock";
String lock11="mylock";
}
class B
{
static String lock2=new String("mylock");
static String lock3="mylock";
String lock22=new String("mylock");
String lock23="mylock";
}
public class HelloWorld {
/**
* @param args
*/
public static void main(String[] args)
{
// TODO 自动生成方法存根
System.out.println("你好");
String a = "Hello";
String b = "Hello";
String c = "HelloHello";
String d = "Hello" + "Hello";
String e = "Hell" + "oHello";
String f = a + b;
String g = a+"Hello";
System.out.println("c == d : " + (c == d)); // true
System.out.println("c == e : " + (c == e)); // true
System.out.println("c == f : " + (c == f)); // false
System.out.println("c == g : " + (c == g)); //false
有这样一个规则:
(1) 当 = 的右边全是字符串常量,那么 = 左边的变量(左值)也成为字符串常量。
(2) 当 = 的右边包含字符串变量(或其它变量),那么 = 左边的变量(左值)也成为字符串变量(StringBuffer().append()...的结果)。
原因: 编译器优化,右边全是常量运算,则生成一个常量;字符串常量不同于字符串变量, 字符串变量常量存于 类常量池 Class Constant Pool中,对于同一个常量的 引用相等。
System.out.println(A.lock1.equals(B.lock2)); // true : 值的比较
System.out.println(A.lock1==B.lock2); //false:引用的比较,new出来的String对象的引用!=同值常量的引用
System.out.println(A.lock1==B.lock3); //true:对于不同的类的Class Constant Pool,可以发生Same String constant reference
A obj_a=new A();
B obj_b=new B();
System.out.println(obj_a.lock11==obj_b.lock22); //false
System.out.println(obj_a.lock11==obj_b.lock23); //true
//原因:同上。对类成员、对象成员同时成立。
}
}
参考:http://forum.javaeye.com/viewtopic.php?t=11649&postdays=0&postorder=asc&start=30
http://forum.javaeye.com/viewtopic.php?t=12961&postdays=0&postorder=asc&start=0&sid=9505d8ef70ecce0626907531c025b884
http://dreamhead.blogbus.com/logs/2005/05/1189478.html
{
static String lock1 ="mylock";
String lock11="mylock";
}
class B
{
static String lock2=new String("mylock");
static String lock3="mylock";
String lock22=new String("mylock");
String lock23="mylock";
}
public class HelloWorld {
/**
* @param args
*/
public static void main(String[] args)
{
// TODO 自动生成方法存根
System.out.println("你好");
String a = "Hello";
String b = "Hello";
String c = "HelloHello";
String d = "Hello" + "Hello";
String e = "Hell" + "oHello";
String f = a + b;
String g = a+"Hello";
System.out.println("c == d : " + (c == d)); // true
System.out.println("c == e : " + (c == e)); // true
System.out.println("c == f : " + (c == f)); // false
System.out.println("c == g : " + (c == g)); //false
有这样一个规则:
(1) 当 = 的右边全是字符串常量,那么 = 左边的变量(左值)也成为字符串常量。
(2) 当 = 的右边包含字符串变量(或其它变量),那么 = 左边的变量(左值)也成为字符串变量(StringBuffer().append()...的结果)。
原因: 编译器优化,右边全是常量运算,则生成一个常量;字符串常量不同于字符串变量, 字符串变量常量存于 类常量池 Class Constant Pool中,对于同一个常量的 引用相等。
System.out.println(A.lock1.equals(B.lock2)); // true : 值的比较
System.out.println(A.lock1==B.lock2); //false:引用的比较,new出来的String对象的引用!=同值常量的引用
System.out.println(A.lock1==B.lock3); //true:对于不同的类的Class Constant Pool,可以发生Same String constant reference
A obj_a=new A();
B obj_b=new B();
System.out.println(obj_a.lock11==obj_b.lock22); //false
System.out.println(obj_a.lock11==obj_b.lock23); //true
//原因:同上。对类成员、对象成员同时成立。
}
}
参考:http://forum.javaeye.com/viewtopic.php?t=11649&postdays=0&postorder=asc&start=30
http://forum.javaeye.com/viewtopic.php?t=12961&postdays=0&postorder=asc&start=0&sid=9505d8ef70ecce0626907531c025b884
http://dreamhead.blogbus.com/logs/2005/05/1189478.html