黑马程序员技术交流社区

标题: String类问题 [打印本页]

作者: 张远游    时间: 2012-11-29 18:43
标题: String类问题
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
           
}
}

还是不太懂,求大师给详细解释下。
作者: 孟伟娟    时间: 2012-11-29 19:00
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。
作者: 孙万利    时间: 2012-11-29 19:13
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
作者: 张远游    时间: 2012-11-29 19:26
孟伟娟 发表于 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”呢?此处比较的是地址么?我有点搞不太懂
作者: 陈山    时间: 2012-11-29 20:48
注解如下:
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           
}
}






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