黑马程序员技术交流社区

标题: 一个小问题,底层是什么区别 [打印本页]

作者: x378320002    时间: 2013-5-23 14:28
标题: 一个小问题,底层是什么区别
本帖最后由 x378320002 于 2013-5-23 21:12 编辑

代码如下:
  1.                 String s1="java";
  2.                 String s2="ja";
  3.                 String s3="ja"+"va";
  4.                 String s4=s2+"va";
  5.                 System.out.println(s1==s3);
  6.                 System.out.println(s1==s4); //false
复制代码
我知道s1=s3,是因为都指向了常量池中的对象,s3发现"java"在池中存在,就不再创建新的,可是s4运算的
具体流程,为什么却又创建了一个新对象呢?常量池中不是已经有了么?
作者: 占琳    时间: 2013-5-23 14:42
首先 你要明白 ==跟equals的区别 ==用来对比 2个变量在内存中地址是否相等,equals用来对比 2个变量的内容是否相等,S1的值是java 内存地址已经创建好了   s4的值是s2加上一个va字符串 在相加的时候自然转换成一个显示java 内容的字符串 但是地址空间并没发生改变 所以 S1跟S4不相等
作者: 江南雨    时间: 2013-5-23 14:48
==是来比较地址空间的!
作者: 无妄无涯    时间: 2013-5-23 15:16
S3的情况是先拼装完字符串,发现“java”这一字符串在常量池中已经存在,就直接将S3指向同S1相同的地址。S4则是创建一个新的地址再将S2指向的字符串同“va”拼接后存入。
作者: 孙茜茜    时间: 2013-5-23 15:31
s4=s2+"va" 里s2是一个已有对象,"va"是一个字面量,不能直接相加。
这样Java虚拟机就会在堆里面生成一个新的对象"va",并返回该对象引用。
然后把这两个字符串连起来,s4表示这个新对象的内存地址,和s1不是同一个对象。
作者: x378320002    时间: 2013-5-23 16:26
占琳 发表于 2013-5-23 14:42
首先 你要明白 ==跟equals的区别 ==用来对比 2个变量在内存中地址是否相等,equals用来对比 2个变量的内容 ...

你意思是 s2和s4的地址岂不是一样?
作者: x378320002    时间: 2013-5-23 16:28
无妄无涯 发表于 2013-5-23 15:16
S3的情况是先拼装完字符串,发现“java”这一字符串在常量池中已经存在,就直接将S3指向同S1相同的地址。S4 ...

嗯,懂了 3q
作者: x378320002    时间: 2013-5-23 16:28
孙茜茜 发表于 2013-5-23 15:31
s4=s2+"va" 里s2是一个已有对象,"va"是一个字面量,不能直接相加。
这样Java虚拟机就会在堆里面生成一个新 ...

嗯 懂了
作者: x378320002    时间: 2013-5-23 16:29
占琳 发表于 2013-5-23 14:42
首先 你要明白 ==跟equals的区别 ==用来对比 2个变量在内存中地址是否相等,equals用来对比 2个变量的内容 ...

懂了~~~~~




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2