关于Java中的运行期确定内容值

String s1="ABCDE";
String s3="ABC";
String s4=s3+"DE";
System.out.println(s4==s1);
各路大神:结果返回false的原因,资料上说是s4在运行期才能确定内容值。我们执行程序后,难道不是运行期?是的话既然确定了内容值,为嘛还不返回true?实在是理解不了,请大神指点。致谢

我们可以知道,String类型是一个典型的不可变类,所以String类型在创建后就不可以改变了。对于String呢,java中提供了一个常量池,常量池是在编译器就可以被确定,s1创建后是存在常量池中的,s3也是存在于常量池中的,也就是说s1和s3在编译器就已经确定了值,s3+“DE”的话是属于重新创建了一个常量,在运行期的时候,s3从常量池中取出,然后再与“DE”相加后再放入常量池中。那么此时==比较的是两个String的内存地址。
举个例子,如果s1、s3不变,s4=“ABC”+“DE”,此时s4 == s1 输出的应该是true。其中运用到的就是java的String常量池。你也可以在网上搜一下这个内容。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2018-08-21
//试试这样写法 

String s1="ABCDE";

String s3="ABC";

String s4=s3+"DE";

System.out.println(s4.equals(s1));

第2个回答  2018-08-21
字符串+操作,java字节码使用stringBuffer来拼装,拼装完成之后,生成的是新的对象,自然跟s1不会相等追问

我把我删掉的那一行s2加上,麻烦大神再给看看:
String s2="ABC"+"DE";
System.out.println(s2==s1);
这样生成的是新的对象不?结果返回的是true

追答

字符串直接常量相加的时候,例如: String c = "aa" + "bb"; 其中的aa/bb只要有任何一个不是字符串字面常量形式,都不会在常量池生成"aabb". 且此时jvm做了优化,不会同时生成"aa"和"bb"在字符串常量池中

第3个回答  2018-08-21
推荐看看string s = new string的内存分配。其次推荐看一下字符串==与.equals的不同之处。
==是比较地址的,.equals是比较字符串值的。

每当新建一个变量时编辑器会自动开辟一个新的空间存值即把值分配到新的内存当中。因此s1,s3,s4的值虽然相同,但内存地址不同。所以==输出为false1,改为s4.equals(s1),输出是true
第4个回答  2018-08-21
==比较地址。String的equals()方法才是比较内容的。比如s1这个变量在内存中的地址是1,s3为2,s4为就为3 。1能 ==3吗当然不能。如果你想比较S1是ABCDE,而s4也是ABCDE的话要使用String的equals方法。
第5个回答  2018-08-21
应该用equals比较 s4.equals(s1) 就是为true了,建议你看下==与equals的区别