String s1 = "世界您好";
String s2 = "世界";
String s3="你好";
String s4= s2 + s3;
String s5 = new String("世界您好!");
//输出false
System.out.println(s1 == s4);
//输出false
System.out.println(s1 == s5);
如果s4="世界"+"你好";这时s1==s4是返回true的,因为这里先进行后面字符串的拼接,拼接完成发现常量池中存在拼接后的字符串(世界您好),即s1和s4指向了同一块地址。你这里之所以这里返回false,是因为变量+会产生新的新的字符串,并在堆内申请地址,所以返回false。s5是直接在堆空间申请地址,和s1不同就很明显了。
“==” 对象操作比较的是二个对象的地址,比较基本数据类型则是比较他们的值
s1 的值为“世界您好”,存储在字符串常量池中,生成一个s1 引用(指向世界您好)放在栈内存中,而 s4 :变量+ 会产生新的字符串, 所以
s1== s4 为false
s5 new一个对象则是堆中分配内存
s1 == s5 为false
String是一个特殊类。String s1=“”,这样的常量值是存放在常量池中的,并且有对应的内存地址。如果是new String(),这样的对象,是在占堆内存中创建对象存放的常量池中的内存地址,此时在堆内存中又会产生新的内存地址。楼主的问题使用的方法时“==”,这种方法比较的是对象的内存地址。不同对象的内存地址自然不同,只不过是内容相同罢了。如果比较内容需要使用equals方法。
==比较的是对象的内存地址;而.equals()比较的是值相等