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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 乔九 中级黑马   /  2012-9-12 23:39  /  2180 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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?

8 个回复

倒序浏览
楼主希望采纳,
    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了。 因为地址值是相同的。

回复 使用道具 举报
楼主,首先要理解这里面的==是值相等,而这里的值相等,是地址值。
第一句话,String s1=''abc";创建了一个字符串对象,s1就是指向"abc"所在字符串常量缓冲区地址,是引用;
第二句话,String s2=new String("abc"),”abc”对应一个对象,这个对象放在字符串常量缓冲区,常量”abc”不管出现多少遍,都是缓冲区中的那一个。New String每写一遍,就创建一个新的对象,它一句那个常量”abc”对象的内容来创建出一个新String对象;
第三句话,String s3="abc",由于常量池中已经有"abc"字符串,所以不用创建了,s3直接指向了s1所指向的字符串,所以第一句话的结果为false,而第二句为true
回复 使用道具 举报
     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
回复 使用道具 举报
在内存里创建了一个abc字符串,s1指向abc,s3要指向abc的时候,内存中已经存在了,所以s1和s3地址相同。
s2在堆中生成新的abc,所以s1和s2地址不相同
回复 使用道具 举报
              == 和 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

回复 使用道具 举报
class Demo
{
     String s1="abc"; //创建一个对象 这个是直接量
     String s2=new String("abc"); //创建两个对象
     Sring s3="abc";这个也是直接量 所以不用创建,直接可在对象池中获取,因为之前已经有了
     System.out.println(s1==s2);所以这两个不是同一个对象
     System.out.println(s1==s3);这个是
}
回复 使用道具 举报
简单来说就是地址不一样 ==比的是引用 也就是地址 你new 一个 就是一个新的地址了 (参考)
回复 使用道具 举报
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有帮助
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马