A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© jaunce 中级黑马   /  2015-8-26 07:51  /  548 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public static void main(String[] args) {
        String s1 = "a";
        String s2 = "b";
        String s3 = "ab";
        System.out.println(s3 == s1 + s2);  //false
        System.out.println(s3 == "a" + "b");  //ture




4 个回复

倒序浏览
s1s2是两个对象
回复 使用道具 举报
本帖最后由 javazhang 于 2015-8-26 16:39 编辑

s1,s2分别是字符串常量池中的两个变量所对应的地址值,相加肯定和s3的地址值是不同的,而字符串相加后的内容都是ab,同样是方法区常量池的一个变量,指向同一个地址值,故前者为false后者为true
回复 使用道具 举报
“a”+"b"编译器会优化为ab,所以认为和s3是同一个;s1+s2属于字符串变量之间相加,会新产生一个StringBuilder类的对象,并用append方法将s1和s2拼接起来,显然s3和新产生的这个对象的地址不一样
回复 使用道具 举报
System.out.println(s3 == s1 + s2);
两个字符串对象相加等于另外一个字符串对象,有没有觉着奇怪?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马