首页 新闻 会员 周边

关于字符串相加的问题,希望解释下面的情况,谢谢。

0
悬赏园豆:50 [已解决问题] 解决于 2014-06-17 19:19
public static void main(String[] args)
    {
        String s1 = "hello";
        String s2 = "world";
        String s3 = s1+s2;
        String s4 = "hello"+"world";
        System.out.println(s4=="helloworld");
System.out.println(s3
=="helloworld");
System.out.println(s3
==s4);
}
运行的结果是:true
       false
       false
关于第一个,我知道是因为字符串相加编译器自动的转成String s4 = "helloworld";这样在比较s4=="helloworld",
所以结果就为true,因为他们都指向了字符串池中的唯一一个"helloworld"。
第二个就不明白了。
mr生如夏花的主页 mr生如夏花 | 初学一级 | 园豆:122
提问于:2014-06-17 14:28
< >
分享
最佳答案
1

这样要看字符串对比时,是对比内存位置,还是对比字符串的值完全相等.

如果对比字符串的值完全相等,那这个地方应该所有的值都为true,所以假设他是对比内存位置.

1.S4明显将是一个常量.2个字符串内容相等,自然会在字符串常量池中有同一个位置.

2.s3将会是一个变量.这时.虽然S3的值等于helloworld,但位置却是不同的.

3.一个道理.s4既然等于常量helloworld自然就不会等于变量helloworld

收获园豆:40
吴瑞祥 | 高人七级 |园豆:29449 | 2014-06-17 14:39

噢,对了,s3是一个变量了,那我想问一下,是不是这个变量存储的地址就不可能指向的是字符串常量中的helloworld,而是重新new了一个字符串,所以s3=s1+s2这句话相当于这样了s3=new String(s1+s2);

mr生如夏花 | 园豆:122 (初学一级) | 2014-06-17 14:47

@mr生如夏花: s1 s2也是变量.只是他们指向一个静态字符串.

2个变量相加自然等于1个新变量.而2个静态字符串相加,如果你查看生成后的运行时代码会发现编译器直接把2个静态字符串合并成一个了.这个是编译器优化的结果

吴瑞祥 | 园豆:29449 (高人七级) | 2014-06-17 16:25

@吴瑞祥: 明白明白,感谢

mr生如夏花 | 园豆:122 (初学一级) | 2014-06-17 19:14
其他回答(3)
0

项目中多用equal比较

收获园豆:5
angelshelter | 园豆:9887 (大侠五级) | 2014-06-17 15:19

嗯,是是,我还知道一般不用str.equal("")的形式,而是用"".equal(str)的形式,可是真想探究一下这个问题。

支持(0) 反对(0) mr生如夏花 | 园豆:122 (初学一级) | 2014-06-17 15:23

@mr生如夏花: 你的理解已经到位了。常量只是编译器优化的结果。

支持(0) 反对(0) angelshelter | 园豆:9887 (大侠五级) | 2014-06-17 15:26

@angelshelter: 噢噢,好的,谢谢哈。在做面试准备,所以想的有点多了

支持(0) 反对(0) mr生如夏花 | 园豆:122 (初学一级) | 2014-06-17 15:30
0

==的比较引用,equal是比较值。明白这个就ok了。

收获园豆:3
幻天芒 | 园豆:37175 (高人七级) | 2014-06-17 16:37

嗯嗯,谢谢

支持(0) 反对(0) mr生如夏花 | 园豆:122 (初学一级) | 2014-06-17 19:17
0

楼主,这个说白了就是值类型和引用类型了。如果面试有这个的话,你就把值类型和引用类型的区别一说就ok

收获园豆:2
呓语鑫 | 园豆:313 (菜鸟二级) | 2014-06-17 17:53

这里边有个创建字符串的问题,问题还是比较多

支持(0) 反对(0) mr生如夏花 | 园豆:122 (初学一级) | 2014-06-17 19:18

@mr生如夏花:  创建的字符串是一个新的变量,是一个新的对象。这样应该还是属于值类型和引用类型吧?这个可以一起交流下,我的表达能力也不太好。

支持(0) 反对(0) 呓语鑫 | 园豆:313 (菜鸟二级) | 2014-06-18 09:35
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册