黑马程序员技术交流社区

标题: String 创建空间 [打印本页]

作者: sheng6699    时间: 2014-5-10 20:48
标题: String 创建空间
本帖最后由 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" 没有计算吗。。谁能帮我在内存方面解释吗。

作者: 轻语。    时间: 2014-5-10 21:20
题目是不是少了些符号?
作者: sheng6699    时间: 2014-5-10 21:43
伍叶竹 发表于 2014-5-10 21:20
题目是不是少了些符号?

现在没事了吧。
作者: 轻语。    时间: 2014-5-10 22:15
本帖最后由 伍叶竹 于 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:33
本帖最后由 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:}
作者: sheng6699    时间: 2014-5-10 23:35
Yov正 发表于 2014-5-10 22:33
其实这个玩意不用记住,知道有个这个事,到时候碰上了是什么结果就可以怎么解释.信不信就算结果相反我也能牵 ...

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

谢谢。。。不错啊,,,,




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