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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© sheng6699 中级黑马   /  2014-5-10 20:48  /  1321 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 sheng6699 于 2014-5-11 22:56 编辑

String s1="ab" ,String s2="cd";  String s3=a+b;  String s4="abcd";     String s5="ab"+"cd;请问:
为什么s3 与 s4 指向的是同一个对象, 而s4与s5 指向的却不是同一个对象。


s3 是s1与s2 计算后的地址,难道 "ab"+"cd" 没有计算吗。。谁能帮我在内存方面解释吗。

6 个回复

倒序浏览
题目是不是少了些符号?
回复 使用道具 举报
伍叶竹 发表于 2014-5-10 21:20
题目是不是少了些符号?

现在没事了吧。
回复 使用道具 举报
本帖最后由 伍叶竹 于 2014-5-10 22:45 编辑
  1. class Demo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.             String s1="ab" ,s2="cd";  
  6.                         String s3=s1+s2;  
  7.                         String s4="abcd";     
  8.                         String s5="ab"+"cd";
  9.                         
  10.                         System.out.println(s3==s4);
  11.                         System.out.println(s4==s5);
  12.                         
  13.                         System.out.println(s3.equals(s4));
  14.                         System.out.println(s3.equals(s4));
  15.                         
  16.                         
  17.         }
  18. }
复制代码
楼主你的题目是我理解的这个意思么?
输出结果是
s3和s4地址值不同。
s4和s地址值相同。
因为:两个字符串常量连接和还是字符串常量("ab"+"cd"),
但是只要其中一个是变量( String s3=s1+s2),就和new的效果一样了,即是在堆上创建。
回复 使用道具 举报
本帖最后由 Yov正 于 2014-5-10 22:35 编辑
  1. /**
  2.          * jvm运用pool技术管理String对象,也就是有一块地方,专门存放String对象.pool里的对象是可重用的
  3.          */
  4.         public static void main(String[] args) {
  5.                 String s1 = "ab";//pool里新增"ab",引用返回给s1
  6.                 String s2 = "cd";//pool里新增"cd"
  7.                
  8.                 String s3 = s1 + s2;//pool里确实新增了一个"abcd"对象,但是s3指向的是堆的地址,堆指向pool中的地址
  9.                 String s4 = "abcd";//pool里"abcd"的引用返回给s4
  10.                 String s5 = "ab" + "cd";//pool里本来就有"abcd"不再生成新的.再次把pool里"abcd"的引用返回给s5

  11.                 //==判断引用是否相等,equals判断内容是否相等,==比equals判断的更苛刻
  12.                 System.out.println("s3 == s4? " + (s3 == s4));//堆的引用和池的引用不等
  13.                 System.out.println("s4 == s5? " + (s4 == s5));//池和池的引用相等
  14.                
  15.         }
复制代码

其实这个玩意不用记住,知道有个这个事,到时候碰上了是什么结果就可以怎么解释.信不信就算结果相反我也能牵强上一些理由{:3_47:}

评分

参与人数 1技术分 +1 收起 理由
轻语。 + 1 赞一个!

查看全部评分

回复 使用道具 举报
Yov正 发表于 2014-5-10 22:33
其实这个玩意不用记住,知道有个这个事,到时候碰上了是什么结果就可以怎么解释.信不信就算结果相反我也能牵 ...

也是,有点疑惑。。
回复 使用道具 举报
本帖最后由 sheng6699 于 2014-5-10 23:42 编辑
伍叶竹 发表于 2014-5-10 22:15
楼主你的题目是我理解的这个意思么?
输出结果是
s3和s4地址值不同。

谢谢。。。不错啊,,,,
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马