黑马程序员技术交流社区

标题: 求解关于String类? [打印本页]

作者: 朝花夕拾    时间: 2012-12-3 22:22
标题: 求解关于String类?
本帖最后由 张雄 于 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,求解释
作者: 程宏志    时间: 2012-12-3 22:40
字符串String是一个对象,既然是一个对象,那么一旦给对象实例化后,对象的只是不会改变的!
在这里面
strValue.substring(3); 这是得到一个新的字符串对象
strValue.concat("123"); 这也是得到一个新的字符串对象

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

              
作者: 杨卫腾    时间: 2012-12-3 22:51
怎么不是这个结果:  

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

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

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

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

那么原来的字符串也是没有改变的,只是引用改变了。
作者: 赵学刚    时间: 2012-12-3 22:58
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是两个不同的地址自然不会相等的。
作者: 黑马刘向阳    时间: 2012-12-3 22:59
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
作者: 马纵驰    时间: 2012-12-4 08:34
字符串在strValue.substring(3); strValue.concat("123");在内存中并没有改变其值。只是做了两个方法调用。而==比较的是地址。ABCDEFG是池中的常量,而new出的ABCDEFG是堆中的实体。地址是不一样的




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