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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张远游 中级黑马   /  2012-11-29 18:43  /  1490 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class  stringTest
{
public static void main(String[] args)
{
        String str = "abc";     
        String str1 = "abc";     
        String str2 = new String("abc");  
  
        System.out.println(str == str1);       //true  
        System.out.println(str1 == "abc");     //true
        System.out.println(str2 == "abc");     //false   
        System.out.println(str1 == str2);      //false
        System.out.println(str1.equals(str2)); //true
           
}
}

还是不太懂,求大师给详细解释下。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1 神马都是浮云

查看全部评分

4 个回复

倒序浏览
String在new对象时,一旦对象建立,其值就不再改变。
String str = "abc";      (1)
  String str1 = "abc";     (2)
  String str2 = new String("abc");  (3)
(1)  行str建立了一个对象,内容为“abc”。str引用指向内容为“abc”的对象。
(2)行 str1 建立对象时,发现对象内容也是“abc”,此时不再建立对象,而是把str1 的引用指向该对象。str和str1 都指向同一对象
(3)行在内存中有两个对象,又创建了另外一个内容为“abc”的对象,str2引用指向它。
所以str == str1     str1 == "abc"为true。 而str2和str1不是指向同一个对象,str2==“abc”   str1==str2 为false
String类中的equals方法比较的是对象中的内容,所以str1.equals(str2)为true。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
class  stringTest
{
public static void main(String[] args)
{
        String str = "abc";     
        String str1 = "abc";     
        String str2 = new String("abc");  
  
        System.out.println(str == str1);       //true  
        System.out.println(str1 == "abc");     //true
        System.out.println(str2 == "abc");     //false   
        System.out.println(str1 == str2);      //false
        System.out.println(str1.equals(str2)); //true
           
}
}


1.String str = "abc";     
这句是创建一个对象str,对象初始化为字符串abc
2.String str1 = "abc";   
这句是创建一个对象str1 ,对象初始化为字符串abc
3.String str2 = new String("abc");  
这句是创建了两个对象,str2和指向字符串abc的对象;


下边就顺理成章了

System.out.println(str == str1);       //true   具有相同的指向abc,所以 true
System.out.println(str1 == "abc");     //true 初始化内容就是abc和abc 完全一样,所以 true
System.out.println(str2 == "abc");     //false   str2是一个对象,abc是字符串所以不全等,所以 false
System.out.println(str1 == str2);      //false     str1是单一对象,而str2却不是单一对象,所以 false
System.out.println(str1.equals(str2)); //true     equals是比较对象中存在的内容 str1和str2中都是  abc,所以 true

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
孟伟娟 发表于 2012-11-29 19:00
String在new对象时,一旦对象建立,其值就不再改变。
String str = "abc";      (1)
  String str1 = "a ...

str=“abc”是在常量池中创建对象,如果池中已有对象“abc”,则str1=“abc”不在创建新的对象,str、str1指向同一个对象“abc”;str2是在堆内存中建立新的对象,故str2与前两个引用指向不同,但是内容相同。问题是str2==“abc”中,“abc”是指的常量池中的“abc”还是堆内存中“abc”呢?此处比较的是地址么?我有点搞不太懂
回复 使用道具 举报
注解如下:
class  stringTest
{
public static void main(String[] args)
{
        String str = "abc";     
        String str1 = "abc";     
        String str2 = new String("abc");  
  
        System.out.println(str == str1);       //因为都指向的是常量池中的“abc”  ,所以地址相同,结果为true
        System.out.println(str1 == "abc");     //str1指向的就是“abc”,所以str1存储的地址值跟“abc”的地址相等,结果为true
        System.out.println(str2 == "abc");   //str2指向的是堆区里面的一个String对象,地址值跟常量池里“abc”的地址值肯定不相等,所以false
        System.out.println(str1 == str2);      //str2指向的是堆区里面的一个String对象,str1指向的是常量池中的“abc”,所以false
        System.out.println(str1.equals(str2)); //equals比的是具体对象的值,因为对象值都为“abc”,所以为true           
}
}

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