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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© x378320002 中级黑马   /  2013-5-23 14:28  /  1414 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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运算的
具体流程,为什么却又创建了一个新对象呢?常量池中不是已经有了么?

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

8 个回复

倒序浏览
首先 你要明白 ==跟equals的区别 ==用来对比 2个变量在内存中地址是否相等,equals用来对比 2个变量的内容是否相等,S1的值是java 内存地址已经创建好了   s4的值是s2加上一个va字符串 在相加的时候自然转换成一个显示java 内容的字符串 但是地址空间并没发生改变 所以 S1跟S4不相等
回复 使用道具 举报
==是来比较地址空间的!
回复 使用道具 举报
S3的情况是先拼装完字符串,发现“java”这一字符串在常量池中已经存在,就直接将S3指向同S1相同的地址。S4则是创建一个新的地址再将S2指向的字符串同“va”拼接后存入。
回复 使用道具 举报
s4=s2+"va" 里s2是一个已有对象,"va"是一个字面量,不能直接相加。
这样Java虚拟机就会在堆里面生成一个新的对象"va",并返回该对象引用。
然后把这两个字符串连起来,s4表示这个新对象的内存地址,和s1不是同一个对象。
回复 使用道具 举报
占琳 发表于 2013-5-23 14:42
首先 你要明白 ==跟equals的区别 ==用来对比 2个变量在内存中地址是否相等,equals用来对比 2个变量的内容 ...

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

嗯,懂了 3q
回复 使用道具 举报
孙茜茜 发表于 2013-5-23 15:31
s4=s2+"va" 里s2是一个已有对象,"va"是一个字面量,不能直接相加。
这样Java虚拟机就会在堆里面生成一个新 ...

嗯 懂了
回复 使用道具 举报
占琳 发表于 2013-5-23 14:42
首先 你要明白 ==跟equals的区别 ==用来对比 2个变量在内存中地址是否相等,equals用来对比 2个变量的内容 ...

懂了~~~~~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马