java
String str = "abc"; String str2 = "a"; String str3 = "bc"; System.out.println(str == str2 + str3); //fasle System.out.println(str == "a" + str3); //fasle System.out.println(str == "a" + "bc"); //true
第一个与第二个结果为什么会false?
第三个是2个字符串直接拼接会在常量池中生成新的对象(当对象已存在时候直接返回对象地址),所以str
的指向的对象和字符串拼接结果
所指向的对象是相同的,不知道这种理解是否有问题?
string str = "abc";
string str2 = "a";
string str3 = "bc";
Console.WriteLine(str == str2 + str3); //true
Console.WriteLine(str == "a" + str3); //true
Console.WriteLine(str == "a" + "bc"); //true
然而C#中的结果都为true,这2种语言对string类型的维护上有什么不同?求大神解答
分析一下字节码就知道了。
现在一个个的分析:
ldc表示将int, float或String型常量值从常量池中推送至栈顶.
astore表示将栈顶引用型数值存入指定本地变量
那么
表示 abc 在运行时常量池中间取出,并且将引用赋给str变量。
同理,str1,str2都一样。
那么这就说明一个问题:
类似于String str1="dddd"说明"dddd"字符串存在运行时常量池中,而不是存在堆中间。
然后看s2+s3:
java运算符重载了加法。也就是字符串的加号是通过StringBuilder的append和toString来完成的。查看toString的源码:
很显然是新生成了一个String,引用地址不一样,那么"=="判断当然为false。
然后看
说明,对于这种情况,java编译器做了优化。直接存储在运行时常量池中间。那么当然为true。
那么C#。。。。不知道他们运行机制是咋样的。