为了账号安全,请及时绑定邮箱和手机立即绑定

为什么s1 == s2是true s3==s4是false

public class HelloWorld {
    public static void main(String[] args) {
        String s1 = "imooc";
        String s2 = "imooc";
        
        //定义字符串s3,保存“I love”和s1拼接后的内容
         String s3= "I love" + s1;
        
        // 比较字符串s1和s2
        // imooc为常量字符串,多次出现时会被编译器优化,只创建一个对象
        System.out.println("s1和s2内存地址相同吗?" + (s1 == s2));
        
        //比较字符串s1和s3
        System.out.println("s1和s3内存地址相同吗?" + (s1==s3) );
        String s4 = "I love " + s1;
         //比较字符串s4和s3
        // s1是变量,s4在运行时才知道具体值,所以s3和s4是不同的对象
        System.out.println("s3和s4内存地址相同吗?" + (s4 == s3));
    }
}

正在回答

1 回答

字符串可以说在被创建后便是一个常量,内容不可更改。

更改的话相当于变相创建了一个新的字符串。

s1创建了一个字符串为imooc,将这个常量保存在了内存里。

创建s2时,由于s2创建的内容和s1一样,所以s2并没有在内存中创建一个新的字符串,而是指向s1所创字符串的内存地址,所以s1和s2指向的是同一个常量,s1=s2。

s3是在s1的基础上创建了一个新的字符串I love imooc,创建时开辟了新的内存地址

s4同理,也是在s1上创建了新的字符串。

字符串之间的比较,是比较内存首地址是否相同,而不是内容。

所以s1和s2在内存的指向上是相同,而s3和s4是各自新开辟的字符串,事先建立的字符串后付的值,所以s3和s4指向的内容并不是一个,所以内存地址不同,从而不相等


10 回复 有任何疑惑可以回复我~
#1

qq_随想之风_03202251

不是太理解,能否以图的形式画出来
2016-07-24 回复 有任何疑惑可以回复我~
#2

cosensible

那如果String s4="I love imooc";这样定义应该就有s3==s4吧
2016-08-09 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

为什么s1 == s2是true s3==s4是false

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信