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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Jim-剣◆﹏ 高级黑马   /  2013-10-31 23:24  /  1037 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 Jim-剣◆﹏ 于 2013-11-1 09:27 编辑

问题在注释那里了

  1. String s1 = new String("amit");
  2. System.out.println(s1.replace('m','r')); //这里返回一个的应该是String的匿名对象,应该在常量池里才对
  3. System.out.println(s1); //s1的值没修改
  4. String s3 = "arit"; //在常量池里
  5. String s4 = "arit";
  6. String s2 = s1.replace('m','r'); //这里应该也是返回一个String的匿名对象,并且直接应用常量池里的“arit”才对
  7. System.out.println(s2 == s3); //那么这里应该返回true 才对,运行返回false,何解?相同值的String对象不相等怎么解释?
  8. System.out.println(s3 == s4);
复制代码
我查了String类的replace的用法

public String replace(char oldChar,char newChar)返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。
如果 oldChar 在此 String 对象表示的字符序列中没有出现,则返回对此 String 对象的引用。否则,创建一个新的 String 对象

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

5 个回复

倒序浏览
String s2 = s1.replace('m','r');这个返回的是String 类的一个对象 存在堆内存中,但是还是会保存其引用 (你可以打印s2和s3的hashCodez值,他两是相等的)
PS:堆:堆存放对象持有的数据,同时保持对原类的引用。可以简单的理解为对象属性的值保存在堆中,对象调用的方法保存在方法区。
String s3 = "arit"; //在常量池里  s3是存在常量池中的  
给你说下 s2的创建过程哈 ,s2为一个对象,先去常量池中找  如果没有就创建“armt”,在去堆内存中创建一个对象,放“armt”的引用
s3在常量池 s2在堆内存中,所以就false了 ,如果用equals就true了

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1 赞一个!

查看全部评分

回复 使用道具 举报
"amit"这种字面字符串是作为对象直接存入常量池或取自常量池的,
属于澡堂子这种喜闻乐见的模式
new String() 是新建一个对象,
它表示澡堂子太屌丝,我要高端洋气上档次的,我非要用一个谁都没碰过的对象,
replace就属于第二种行为
所以你这个s2和s3就是高帅富和屌丝的差别,虽然从equals的角度看起来是一个吊样
如果第六行改成
String s2 = s1.replace('m','r').intern();
就表示你们这个澡堂子太脏了,拆了吧,我给你们新建一个,属于有良心的高帅富作风,值得提倡,不过人家的真实意思是,我洗完了你们再随便用。。。
推荐你去读读 String 的 intern 方法的API帮助文档

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
本帖最后由 黄炳期 于 2013-11-1 08:30 编辑
喂,咱不离! 发表于 2013-11-1 01:01
String s2 = s1.replace('m','r');这个返回的是String 类的一个对象 存在堆内存中,但是还是会保存其引用  ...

new String()出来的对象在常量池外。
替换s1里的字符后,字符串对象还是在常量池外,一个在常量池里,一个在常量池外。那么地址引用就不相等。
希望能帮到你。
回复 使用道具 举报
如果问题已经解决,请及时修改主题为“提问结束”
回复 使用道具 举报
黄炳期 发表于 2013-11-1 08:29
new String()出来的对象在常量池外。
替换s1里的字符后,字符串对象还是在常量池外,一个在常量池里,一个 ...

哦 不是去看看常量池有没有,就直接去内存创建对象了吗?有点迷惑?我的记得,好像是先去看下常量池 在去内存创建对象的?难道不记得不对吗 求解答
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马