黑马程序员技术交流社区

标题: 求解 [打印本页]

作者: 乔九    时间: 2012-9-12 23:39
标题: 求解
class Demo
{
     String s1="abc";
     String s2=new String("abc");
     Sring s3="abc";
     System.out.println(s1==s2);
     System.out.println(s1==s3);
}为什么第一个false第二个结果为true?
作者: 李志群    时间: 2012-9-12 23:49
楼主希望采纳,
    String s1="abc";  这段代码是你创建了一个字符串,名为s1值是"abc”;会有一个地址值。
      String s2=new String("abc");这断代码是 你创建的是一个字符串对象, 这个对象名称是"abc"他会在堆内存中创建,因为是对象,也有默认的地址值。
      Sring s3="abc";这段代码和第一个一样 这里就不说了。这个s3会指向"abc" 因为你以前创建过了 也就相当于覆盖了。 其实和s1的地址值是相同的指向。
      System.out.println(s1==s2); 这个你比较的结果一定是flase 因为地址值不一样。
      System.out.println(s1==s3);这个一定是true了。 因为地址值是相同的。


作者: 张忠豹    时间: 2012-9-12 23:53
楼主,首先要理解这里面的==是值相等,而这里的值相等,是地址值。
第一句话,String s1=''abc";创建了一个字符串对象,s1就是指向"abc"所在字符串常量缓冲区地址,是引用;
第二句话,String s2=new String("abc"),”abc”对应一个对象,这个对象放在字符串常量缓冲区,常量”abc”不管出现多少遍,都是缓冲区中的那一个。New String每写一遍,就创建一个新的对象,它一句那个常量”abc”对象的内容来创建出一个新String对象;
第三句话,String s3="abc",由于常量池中已经有"abc"字符串,所以不用创建了,s3直接指向了s1所指向的字符串,所以第一句话的结果为false,而第二句为true
作者: 杨千里    时间: 2012-9-13 00:17
     String s1="abc";//相当于创建了一个对象
     String s2=new String("abc");//相当于创建了2个对象
     Sring s3="abc";//相当于创建了一个对象

    这里s1和s3指向了同一个引用,相当于指向了同一个对象,他们的地址都相同。

     System.out.println(s1==s2);//s1和s2是不同的对象,地址也不相同,所以false
     System.out.println(s1==s3);//s1和s3地址相同,所以true

作者: 李菁    时间: 2012-9-13 00:18
在内存里创建了一个abc字符串,s1指向abc,s3要指向abc的时候,内存中已经存在了,所以s1和s3地址相同。
s2在堆中生成新的abc,所以s1和s2地址不相同
作者: 吴通    时间: 2012-9-13 05:39
              == 和 equals的区别:
==主要是两个变量值的比较,返回值为true 或者是false。对于普通变量,如:int a=10; int  b= 10; a==b,返回为 true。
而对于下面情况:
String  a=new String("abc");
String  b=new String("abc");
a==b; 返回的则是一个false。这是因为,对于对象的比较是对对象引用的比较,对于a和b ,他们在内存中对应的地址是不一样的,所以 a==b 返回的值是一个false.
==操作符并不涉及对象内容的比较。若要对对象内容进行比较,则用equals. 如果 在本例中,a.equals(b)则返回是一个true值。
总而言之,==是对对象地址的比较,而equals是对对象内容的比较。对于基本数据类型,一般用==,而对于字符串的比较,一般用equals

在创建String s1时是一个对象,而Sring s2是两个dx,一个是s2,另一个是字符串,所以s1和
s2地址值是不一样的,所以第一句话为false
而String s1和String s3都为"abc",它们都指向内存中同一个地址值,所以为true


作者: 尤圣回    时间: 2012-9-13 15:25
class Demo
{
     String s1="abc"; //创建一个对象 这个是直接量
     String s2=new String("abc"); //创建两个对象
     Sring s3="abc";这个也是直接量 所以不用创建,直接可在对象池中获取,因为之前已经有了
     System.out.println(s1==s2);所以这两个不是同一个对象
     System.out.println(s1==s3);这个是
}
作者: 班志国    时间: 2012-9-13 15:47
简单来说就是地址不一样 ==比的是引用 也就是地址 你new 一个 就是一个新的地址了 (参考)
作者: 陈俊来    时间: 2012-9-13 16:18
class Demo
{
     String s1="abc";//指向的是abc的这个字符串的地址.     
String s2=new String("abc");//这个是重新new了一个String,所以指向的地址和
s1的不是同一个
     
Sring s3="abc";//指向的地址和s1所指向的地址是相同的     
System.out.println(s1==s2);
     System.out.println(s1==s3);
}
希望对lz有帮助





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