黑马程序员技术交流社区

标题: 这个题目睡个解释下哦? [打印本页]

作者: ziyu0971    时间: 2015-2-12 15:59
标题: 这个题目睡个解释下哦?
public class Foo {
        public static void main(String[] args) {
                String strValue="ABCDEFG";
                strValue.substring(3);
                strValue.concat("123");
                System.out.println("result=" + strValue);//ABCDEFG
               
                String value = new String ("ABCDEFG");
                System.out.println(strValue== value);//false

        }
}



作者: qq8921310    时间: 2015-2-12 16:03
前两个方法都有返回值,不是在原字符串上改变,所以打印的还是源字符串。
第二个结果因为新new了一个 对象,跟元对象虽然共享一个值,但是存放的地址不一样。所以是false。
如果是equals 的话就是true
作者: 菠菜树    时间: 2015-2-12 18:24
貌似这个跟基础测试里面的一个题基本是一个样子。。。
作者: 鸿鹄2008    时间: 2015-2-13 00:52
本帖最后由 鸿鹄2008 于 2015-2-13 01:03 编辑
qq8921310 发表于 2015-2-12 16:03
前两个方法都有返回值,不是在原字符串上改变,所以打印的还是源字符串。
第二个结果因为新new了一个 对象 ...

因受 @qq892131 回复的启发,看到最后那两句我有不解的地方(后面说),所以这样回复楼主和 qq892131

觉得这样改动下,方便看明白是怎么回事和方便描述,可以试着跑下
  1. public class Foo {
  2.     public static void main(String[] args) {
  3.                 String aStr="ABCDEFG";
  4.         String bStr = aStr.substring(3); //
  5.         System.out.println(aStr + "\t地址:" + aStr.hashCode());
  6.         System.out.println(bStr + "\t地址:" + bStr.hashCode());
  7.         System.out.println("\t====================");

  8.                 String cStr = aStr.concat("123");
  9.         System.out.println(aStr + "\t地址:" + aStr.hashCode());
  10.         System.out.println(cStr + "\t地址:" + cStr.hashCode());
  11.         System.out.println("\t=====================");
  12.                
  13.         String dStr = new String ("ABCDEFG");
  14.         System.out.println(aStr == dStr);//false
  15.         System.out.println(aStr.equals(dStr));

  16.         System.out.println(aStr.hashCode());
  17.         System.out.println(dStr.hashCode());
  18.     }
  19. }
复制代码






String bStr = aStr.substring(3);

这里头:返回一个 新的String对象,此对象存的是 aStr字符串从第3个下标到字符串结尾,就是“DEFG”。
返回的是一个aStr的字串,是一个新字符串对象,没有直接对原字符串aStr改动。




String cStr = aStr.concat("123");
返回一个新的String对象,此对象是先把aStr的内容复制过来,再把字符串“123”接上去,就是"ABCDEFG123"。
也是没有直接对原字符串aStr该改动。




这里有点不明白了,向大家求解
System.out.println(aStr == dStr);//false
判断aStr和dStr是否为同一个对象结果是false
我理解为 他们不是同一个对象。
System.out.println(aStr.equals(dStr));
判断aStr和dStr是否字符串值一样,也就是说 是否为 相同的字符序列,结果是true,明显是相同的字符序列


System.out.println(aStr.hashCode());
System.out.println(dStr.hashCode());
输出aStr和dStr两个对象的地址,结果两个地址相同,
问题1:竟然指向相同的地址,为什么 aStr == dStr的结果是false?
问题2:如果aStr和dStr是两个不同的对象,那么为什么指向地址相同??











作者: 鸿鹄2008    时间: 2015-2-13 00:55
本帖最后由 鸿鹄2008 于 2015-2-13 00:59 编辑

刚才代码乱了:L



作者: qq8921310    时间: 2015-2-13 10:50
鸿鹄2008 发表于 2015-2-13 00:52
因受 @qq892131 回复的启发,看到最后那两句我有不解的地方(后面说),所以这样回复楼主和 qq892131

觉 ...

HashCode 值不是内存地址值,
内容一样HashCOde值就一样。
== 比较的是地址值。把常量池中的地址放到new的对象里而已。所以equals 相等但是 == 不同。
只要有new  == 就不同
作者: ziyu0971    时间: 2015-2-13 15:39
qq8921310 发表于 2015-2-13 10:50
HashCode 值不是内存地址值,
内容一样HashCOde值就一样。
== 比较的是地址值。把常量池中的地址放到new ...

非常感谢,我明白了哦、、、:D




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