java中字符串的问题,两个字符串常量池里的字符串拼接在一起为什么结果和我想的不一样

String a="helloworld";
String p="world";
String b="hello"+p;
String c="hello"+"world";
System.out.println(a==b);
System.out.println(a==c);

输出为:
false
true
请问第一个输出为什么是false,想了很久都不懂

首先比较的是 引用地址 而不是里面的值。如果想比值就用equals。
字符串常量:由相同序列的字符组成的两个字符串属于同一对象,位于内存中的同一个位置。
所以在编译期间a 是字符串常量"helloworld"的地址。

因为String c="hello"+"world";在编译期间也能直接执行,故也是指向字符串常量"helloworld"的地址。
而b是在运行期间创建,这两条语句所创建的"helloworld"字符串作为String对象存储在内存中的一个独立位置。
所以才有这个现象
温馨提示:内容为网友见解,仅供参考
第1个回答  2016-09-27
对象a保存的是字符串"helloworld"的内存地址,对象b保存的是字符串"hello"的内存地址和对象p的值,而对象p的值是字符串"world"的内存地址,对象c保存的是字符串"hello"和"world"拼接后的字符串的地址,而java虚拟机会判断拼接后的字符串在内存中是否已存在,如果有,将现有的字符串的地址返回给对象c,也就是说对象a和对象c指向同一个地址;java中的==是判断对象本身保存的值是否相等,显然,a和b不相等,a和c相等;另外,字符串是否相等的判断一般都是调用方法equals追问

我知道equals,我是故意用的==,
您说的“对象b保存的是字符串"hello"的内存地址和对象p的值”是什么意思,我不太懂,b不是应该指向"helloworld"这个字符串吗

第2个回答  2016-09-27
讲道理,字符串作比较应该用a.equals(b)这样的。这才是标准的字符串比较。追问

我知道,我这个就是故意用的==,我想看看是不是指向同一个地址

相似回答