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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 谷龙强 中级黑马   /  2013-7-2 00:23  /  1469 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

String s1 = "ab";
s1 = s1+"cd";
String s2 = "ab"+"cd";
String s3 = "abcd“;
问s1、s2、s3中那些是同一个对象那些不是同一对象?

评分

参与人数 1技术分 +1 收起 理由
孙百鑫 + 1 神马都是浮云

查看全部评分

5 个回复

倒序浏览
s1的值是经过两次运算得来的。简单来说。ab原来在常量池中有一个地址。后来后cd组合形成一个新的abcd ,它和ab具有不同的地址值。s2,s3因为都是直接定义出来的而且值还一样。所以他们在内存中的指向同一个地址值。 所以s1的不同于s2,s3的。

评分

参与人数 1技术分 +1 收起 理由
孙百鑫 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
j816326 发表于 2013-7-2 01:01
s1的值是经过两次运算得来的。简单来说。ab原来在常量池中有一个地址。后来后cd组合形成一个新的abcd ,它 ...

哦,这样啊,受教啦,原来这样子的啊
回复 使用道具 举报
s1、s2、s3中都不是同一对象!
  1. <p>
  2. public class Strings1 {
  3. public static void main(String[] args) {
  4.    String s1 = "ab";     //可以写成   String s1 =new String("ab");现在这个s1和下面那个s1是同一个变量,但指向不同的实体
  5.    s1 = s1+"cd";     //可以写成   s1 = new String(s1+"cd");  
  6.    String s2 = "ab"+"cd";   //可以写成   String s2 =new String("ab"+"cd");
  7.    String s3 = "abcd";   ////可以写成   String s3 =new String("abcd");
  8.    System.out.print(s1+","+s2+","+s3);
  9. }</p><p>}

  10. </p><p> </p>
复制代码

Sting.png (21.66 KB, 下载次数: 0)

可能有些错误请高手指教

可能有些错误请高手指教

评分

参与人数 1技术分 +1 收起 理由
孙百鑫 + 1 赞一个!

查看全部评分

回复 使用道具 举报
王广亚 发表于 2013-7-2 08:55
s1、s2、s3中都不是同一对象!

哥们我错了,也是刚知道的,不要误导了你,现在修改一下。
下面是我刚在用户名uuom哥们那学来的,在这谢谢这哥们。

创建字符串对象可以有两种方式:
   1)String str1 = new String("abc");     
   2)String str2 = "abc";   
   虽然两个语句都是返回一个String对象的引用,但是jvm对两者的处理方式是不一样的。
   对于第一种(用new关键词创建的),jvm会马上在堆中创建一个String对象,然后将该对象的引用返回给用户。
   对于第二种,jvm首先会在内部维护的strings pool中通过String的 equels() 方法查找是对象池中是否存放有该String对象,如果有,则返回已有的String对象给用户,而不会在heap中重新创建一个新的String对象;如果对象池中没有该String对象,jvm则在heap中创建新的String对象,将其引用返回给用户,同时将该引用添加至strings pool中。

回复 使用道具 举报
王广亚 发表于 2013-7-2 09:47
哥们我错了,也是刚知道的,不要误导了你,现在修改一下。
下面是我刚在用户名uuom哥们那学来的,在这谢 ...
  1. <p>

  2. public class Strings1 {
  3. public static void main(String[] args) {
  4.    String s1 = "ab";     //可以写成   String s1 =new String("ab");现在这个s1和下面那个s1是同一个变量,但指向不同的实体
  5.    s1 = s1+"cd";   
  6.    String s2 = "ab"+"cd";   //可以写成   String s2 =new String("ab"+"cd");
  7.    String s3 = "abcd";   //因为已经s2指向的地址值的实体和说s3相同,所以就直接把s2指向的实体的地址值赋给s3;所以s2和s3的地址值相同
  8.    System.out.print(s1+","+s2+","+s3);
  9. }
  10. </p><p>
  11. </p><p> </p>
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马