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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 朝花夕拾 中级黑马   /  2012-12-3 22:22  /  1440 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张雄 于 2012-12-4 22:08 编辑

public class Test1{
        public static void main(String[] args) {
                String strValue="ABCDEFG";
                strValue.substring(3);
                strValue.concat("123");
                System.out.println("result=" + strValue);
               
                String value = new String ("ABCDEFG");
                System.out.println(strValue== value);
        }
}
该代码中为什么输出结果是 result=ABCDEFG,false,求解释

评分

参与人数 2技术分 +1 黑马币 +90 收起 理由
奋斗的青春 + 90
古银平 + 1 神马都是浮云

查看全部评分

5 个回复

正序浏览
字符串在strValue.substring(3); strValue.concat("123");在内存中并没有改变其值。只是做了两个方法调用。而==比较的是地址。ABCDEFG是池中的常量,而new出的ABCDEFG是堆中的实体。地址是不一样的
回复 使用道具 举报
strValue.substring(3);
strValue.concat("123");  这两个方法分别返回一个新的字符串

字符串一经创建,就不能修改, strValue没有被重新赋值新的字符串,所以不变。
String strValue="ABCDEFG"; 是在常量池内存放了"ABCDEFG",然后strValue 指向"ABCDEFG"
String value = new String ("ABCDEFG");其实创建了两个对象,一个是value,value存放的是堆内存中的地址,一个是"ABCDEFG"
==号是比较栈内存中两个变量strValue和value指向的地址是否相等,所以返回false;
String类重写了equals()方法,使用equals()方法比较就会返回true

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
public class Test1{
        public static void main(String[] args) {
                String strValue="ABCDEFG";
                System.out.println(strValue.substring(3))  ;
               System.out.println(strValue.concat("123"));
                System.out.println("result=" + strValue);
               
                String value = new String ("ABCDEFG");
                System.out.println(strValue.toCharArray().hashCode());
                System.out.println(value.toCharArray().hashCode());
                System.out.println(strValue== value);
        }
}
输出:DEFG
ABCDEFG123
result=ABCDEFG
21287110
15111830
false

  通过这个结果就能很好理解字符串类型的不变性,无论你做什么对初始值 strValue,==是比较对象的,21287110
15111830是两个不同的地址自然不会相等的。

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
怎么不是这个结果:  

哥们这个两个方法都是返回一个新的字符串呀!就是在原来字符串的基础上

截取一段作为新的字符串,原来的字符串是不会改变的,一个字符串要是

一旦创建出来的话是不会改变的。 要是你的是这样的语句:

  strValue = strValue.substring(3);
  strValue = strValue.concat("123");

那么原来的字符串也是没有改变的,只是引用改变了。

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
字符串String是一个对象,既然是一个对象,那么一旦给对象实例化后,对象的只是不会改变的!
在这里面
strValue.substring(3); 这是得到一个新的字符串对象
strValue.concat("123"); 这也是得到一个新的字符串对象

System.out.println(strValue== value);
这句话中你应该明白一个通过==来比较比的什么,在这里比较的是对象,两个不同的对象来比,地址值不相同,随意是false。
如果value="ABCDEFG";那结果就是true了,那是因为,strvalue和value的地址值指向的是同一个值

              

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马