h*******a 发帖数: 165 | 1 代码如下
public class StringRead{
public static void main(String[] args){
String s = args[0];
String s0 = "ab";
if (s == s0) System.out.println("s == s0");
String s1 = "ab";
String s2 = "ab";
if (s1 == s2) System.out.println("s1 == s2");
}
}
编译成功后运行 java StringRead ab (读入"ab"赋值给args)
打印结果是 s1 == s2
为什么 s == s0 return false 但是 s1 == s2 return true?
谢谢! |
g*****g 发帖数: 34805 | 2 It's because "ab"=="ab" but "ab" != new String("ab")
【在 h*******a 的大作中提到】 : 代码如下 : public class StringRead{ : public static void main(String[] args){ : String s = args[0]; : String s0 = "ab"; : if (s == s0) System.out.println("s == s0"); : String s1 = "ab"; : String s2 = "ab"; : if (s1 == s2) System.out.println("s1 == s2"); : }
|
h*******a 发帖数: 165 | 3 Got it! Thanks!
【在 g*****g 的大作中提到】 : It's because "ab"=="ab" but "ab" != new String("ab")
|
d****g 发帖数: 7460 | 4 这个也就是个偶然吧?不同编译器可能有不同结果的。不觉得specification会要求s1=
=s2
【在 h*******a 的大作中提到】 : Got it! Thanks!
|
g*****g 发帖数: 34805 | 5 In hotspot, all literal Strings point to the same instance directly or
indirectly. Not sure that's a spec requirement though.
s1=
【在 d****g 的大作中提到】 : 这个也就是个偶然吧?不同编译器可能有不同结果的。不觉得specification会要求s1= : =s2
|
d****g 发帖数: 7460 | 6 It actually IS guranteed by spec... :( Weird
http://stackoverflow.com/questions/767372/java-string-equals-ve
also, "abc" == "ab" + "c" as well.
【在 g*****g 的大作中提到】 : In hotspot, all literal Strings point to the same instance directly or : indirectly. Not sure that's a spec requirement though. : : s1=
|
s****s 发帖数: 628 | 7 为什么 "ab" != new String("ab") ?
【在 g*****g 的大作中提到】 : It's because "ab"=="ab" but "ab" != new String("ab")
|
F****n 发帖数: 3271 | 8 Java String *大多数* 指向Constant pool
但由 new String(java.lang.String)生成的String指向新的object
这些是相等的
"aa"
new String({'a', 'a'})
(new StringBuilder("aa")).toString()
这个不等
new String("aa");
【在 s****s 的大作中提到】 : 为什么 "ab" != new String("ab") ?
|
o**1 发帖数: 6383 | 9 这叫 Flyweight pattern.
当你直接使用 "ab" 的时候,是建一次以后再使用"ab"都是share同一个 object
节省内存。
所以 "ab"=="ab"
但是 new String("ab") 就是新建一个 object 就不相等了。
符号 == 不是检查 value 是否相等,是检查是否指向同一个 object
建string 的时候都要用 "some string", 不要 new String("ddd")
【在 s****s 的大作中提到】 : 为什么 "ab" != new String("ab") ?
|
s****s 发帖数: 628 | 10 你的意思
"aa" == new String({'a', 'a'})
"aa" == (new StringBuilder("aa")).toString()
这两个怎么解释?
【在 F****n 的大作中提到】 : Java String *大多数* 指向Constant pool : 但由 new String(java.lang.String)生成的String指向新的object : 这些是相等的 : "aa" : new String({'a', 'a'}) : (new StringBuilder("aa")).toString() : 这个不等 : new String("aa");
|
F****n 发帖数: 3271 | 11 These two are not created by new String(java.lang.String),
so will point to the constant pool
【在 s****s 的大作中提到】 : 你的意思 : "aa" == new String({'a', 'a'}) : "aa" == (new StringBuilder("aa")).toString() : 这两个怎么解释?
|