String c="a"+"b";
String s="ab";
System.out.println(s==c);
结果相等
String a="a";
String b="b";
String c=a+b;
String s="ab";
System.out.println(s==c);
为什么结果不相等???
String s="ab";
System.out.println(s==c);
结果相等
String a="a";
String b="b";
String c=a+b;
String s="ab";
System.out.println(s==c);
为什么结果不相等???
java字符串是对象 s==c是比较它们在内存中的地址
比较内容的话可以用:
s.equals(c)
String b="b";
String c=a+b;可能不会在字符串常量池中产生一个"ab"字符串常量吧。
肯定是不等于的了。...
equals()
你试下看。...
而==比较的是reference
.....
所以不管
String c="a"+"b";
String s="ab";
在内存中只有一个“ab”。c和s都是指向一个常量“ab”,所以c和s肯定是相等的。
这个问题还有就是常量池的问题
JVM在定义c和s的时候。所有常量都放在一个常量池里。因为C和S现在是个常量。直接常量与直接常量相加等于常量。JVM在编译时已经知道这个常量了。
而下面的String a="a";
String b="b";
String c=a+b;
String s="ab";
System.out.println(s==c); JVM在编译时只放入了常量 a ,b,s,
c在编译时根本没有经过运算。不是一个常量,只有在运行时才能知道结果。。所是他是新产生的对象。故内存地址并不一样。所以不等。
建议看下候结写那个JAVA编程思想。里面对于常量池有详细的说明。
Very Good。。
好像C#中对字符串的处理也是这样子的
不管建立多少个引用,只要字符串的内容相同,引用所指向的都是同一个内存地址,但是
内容却是不可以更改的》。