==是比较引用是否相等,即比较的是是否引用的同一个对象。
你的代码中:
s1引用的是常量池中的字符串对象"abc",而s2+s3会在堆中创建一个字符串对象"abc",它们是两个不同的对象,==的结果当然是false。
可以改用equals方法,比较值是否相等,像这样:
s1.equals(s2+s3)。
如果是这样的:
String s1="abc";
final String s2="a";
final String s3="bc";
则s1==s2+s3的结果就是true。因为s2、s3是常量(final修饰),常量字符串连接后依然是常量。所以,s2+s3引用的也是常量池中的字符串对象"abc",与s1引用的是同一个对象,==的结果就是true。
下面是验证:
(s2+s3)虽然值与s1相同但是相当于你在空间里new了一个新的string地址是不能直接调用原有的s1的
string型的不能==来判断。String不只是一个类型,还是一个封装好的类,除了内容外还包含存储地址以及各种方法,它和int有着本质的不同。==代表完全相同,String是不可能的,指向的存储地址就不一样
改成s1.equals(s2 + s3)