Java字符串内存地址

szy3121 2012-02-03 09:25:56
String ss1="a"+"bc";
String ss2="abc";
System.out.println(ss1==ss2);//true

ss1=ss1+"def";
ss2="abc"+"def";
System.out.println(ss1==ss2);//false---为什么?
...全文
608 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhguo0o 2013-09-16
  • 打赏
  • 举报
回复
第一个好解释,都是放在栈里的同一内容!第二个,因为你用到了ss1=ss1+"def",所以这个时候的ss1已经被先转换为对象了,然后虚拟机会新建一个new String("def");然后在和ss1相加,结果也是一个字符串对象,这个时候ss1已经放在堆里面了!而ss2还只是一般的字符串相加自然还是放在栈里面,这个时候放的地方都不一样了,在用等号比较肯定是false了
笑一笑 2012-02-05
  • 打赏
  • 举报
回复
1、字符串是放在静态的代码区域,在类一开始被加载的时候此常量就被初始化放在这个区内,而且被全局所共享,所有的访问直接指向他即可。
刚开始ss1已经存在abc了
当你在创建一个引用的时候 首先他回去找在静态代码区域里面有没有此常量。
如果有,相同的,就指向相同的内存地址。
2、第二次由于内存地址改变了,所以等于false
“==” 是比较栈内存地址是否一样
diffmaker 2012-02-03
  • 打赏
  • 举报
回复
编译期能确定相同的字符串才会指向常量池中同一个字符串

学习
安心逍遥 2012-02-03
  • 打赏
  • 举报
回复
编译期能确定相同的字符串才会指向常量池中同一个字符串
panpan0430 2012-02-03
  • 打赏
  • 举报
回复
关键是要弄懂==的含义。
==和equal不要用错了
结贴是美德 2012-02-03
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 sunyiz 的回复:]

编译期能确定相同的字符串才会指向常量池中同一个字符串
什么样的编译期就能确定呢?
那就是由常量来初始化的字符串

ss1=ss1+"def";
右侧有变量,所以编译期不能确定

不过再次强调,不需要研究和专这种问题
java 对此的实现有过改变,难保以后不改
搞清楚这个问题没有任何意义
[/Quote]

就怕面试问这样的问题。。
sunyiz 2012-02-03
  • 打赏
  • 举报
回复
编译期能确定相同的字符串才会指向常量池中同一个字符串
什么样的编译期就能确定呢?
那就是由常量来初始化的字符串

ss1=ss1+"def";
右侧有变量,所以编译期不能确定

不过再次强调,不需要研究和专这种问题
java 对此的实现有过改变,难保以后不改
搞清楚这个问题没有任何意义
MiceRice 2012-02-03
  • 打赏
  • 举报
回复
确实有点日经。

String的享元模式,在编译时能立即确定的常量,才能比较好的发挥效用。而且目前这个效果已经是编译器优化后的了;没记错的话,老早以前的Java,第一条也没法true。

ss1=ss1+"def"; 运行时才知道ss1的内容,编译器还没那么聪明可以推断出ss1到这里的时候能是个啥。
结贴是美德 2012-02-03
  • 打赏
  • 举报
回复
貌似是ss1=ss1+"def";这行等号右面有变量的缘故。。。
结贴是美德 2012-02-03
  • 打赏
  • 举报
回复
不懂啊 等待大牛日经
parjing 2012-02-03
  • 打赏
  • 举报
回复

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧