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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ziyu0971 中级黑马   /  2015-2-12 15:59  /  1288 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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

        }
}


6 个回复

倒序浏览
前两个方法都有返回值,不是在原字符串上改变,所以打印的还是源字符串。
第二个结果因为新new了一个 对象,跟元对象虽然共享一个值,但是存放的地址不一样。所以是false。
如果是equals 的话就是true
回复 使用道具 举报
貌似这个跟基础测试里面的一个题基本是一个样子。。。
回复 使用道具 举报
本帖最后由 鸿鹄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:59 编辑

刚才代码乱了:L


回复 使用道具 举报
鸿鹄2008 发表于 2015-2-13 00:52
因受 @qq892131 回复的启发,看到最后那两句我有不解的地方(后面说),所以这样回复楼主和 qq892131

觉 ...

HashCode 值不是内存地址值,
内容一样HashCOde值就一样。
== 比较的是地址值。把常量池中的地址放到new的对象里而已。所以equals 相等但是 == 不同。
只要有new  == 就不同
回复 使用道具 举报
qq8921310 发表于 2015-2-13 10:50
HashCode 值不是内存地址值,
内容一样HashCOde值就一样。
== 比较的是地址值。把常量池中的地址放到new ...

非常感谢,我明白了哦、、、:D
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马