黑马程序员技术交流社区

标题: 新手请教,为什么结果会是这样 [打印本页]

作者: 范天成    时间: 2013-1-22 23:27
标题: 新手请教,为什么结果会是这样
本帖最后由 张向辉 于 2013-1-23 10:45 编辑

代码如下:
public class Test {  
   public static void main(String [] args)

{        
String str1= new String("abc");      
String str2 = new String("abc");     
String str3=str1;        
if(str1.equals(str2))
{            
System.out.println("true");        
}
else
{
System.out.println("false");
}  
if(str1==str2)//此处不也是true么?
{            
System.out.println("true");        
}
else
{
System.out.println("false");
}        
if(str1==str3)
{
System.out.println("true");        
}
else
{            
System.out.println("false");
}
}
}
输出结果是:true  faulse  true    我怎么感觉应该是true  true  true
作者: 低调的奢华    时间: 2013-1-22 23:36
本帖最后由 低调的奢华 于 2013-1-22 23:39 编辑

对于字符串变量来说,使用“==”和“equals()”方法比较字符串时,其比较方法不同。
“==”比较两个变量本身的值,即两个对象在内存中的首地址。
“equals()”比较字符串中所包含的内容是否相同。

比如:
s1 = new String("abc");
s2 = new String("abc");

那么:
s1==s2   是 false      //两个变量的内存地址不一样,也就是说它们指向的对象不 一样,故不相等。
s1.equals(s2) 是 true    //两个变量的所包含的内容是abc,故相等。

所以,你懂的!
作者: 贾文泽    时间: 2013-1-22 23:43
String str1= new String("abc");      
String str2 = new String("abc");     

这种方式每次都会在堆中创建一个新的对象,str1跟str2分别指向各自创建的对象,自然返回是false
作者: 黄金龙    时间: 2013-1-22 23:54
  1. public class Test {  
  2.    public static void main(String [] args)

  3. {        
  4. String str1= new String("abc");       //这里创建一个对象就会有一个地址值.....
  5. String str2 = new String("abc");     //这里再创建一个对象就是一个新的地址值...2个地址值都是不相同的..
  6. String str3=str1;        
  7. if(str1.equals(str2))
  8. {            
  9. System.out.println("true");        
  10. }
  11. else
  12. {
  13. System.out.println("false");
  14. }  
  15. if(str1==str2)//此处不也是true么?
  16. {            
  17. System.out.println("true");        
  18. }
  19. else
  20. {
  21. System.out.println("false");
  22. }        
  23. if(str1==str3)
  24. {
  25. System.out.println("true");        
  26. }
  27. else
  28. {            
  29. System.out.println("false");
  30. }
  31. }
复制代码

作者: 舒远    时间: 2013-1-23 09:01
论坛充斥着这种==和equals的区别的帖子。。你有搜过再发帖么?
作者: Just_Only    时间: 2013-1-23 09:49
同意上面版主的看法,什么问题不要开始就发帖问,首先得自己找找看下有没有类似的问题,如果木有在发帖询问。
作者: 逍林游    时间: 2013-1-23 10:14
首先你必须明白obj1.equals(obj2)方法与“obj1==obj2”的区别:obj1.equals(obj2)方法比较的是obj1和obj2中的内容是否相等;“obj1==obj2”是进行obj1和obj2内存中的首地址的比较。
明白这点,再来看String str1= new String("abc");  //使用new表示在内存中重新为str1分配内存地址     
                       String str2 = new String("abc");  //使用new表示在内存中重新为str2分配内存地址 ,尽管str1和str2内容相同
                       String str3=str1;                       //将str3指向str1的内存地址
综上所述:str1.equals(str2)结果为:true;str1==str2结果为:false;str1==str3结果为:true。
ok了!

作者: 高浩    时间: 2013-1-23 15:42
字符串比较特殊,它定义有不同的方式:
第一种:
String  str1="abc1";
第二种:
String str1=new String("abc1");
第一种创建后在字符串常量池会有记录,当在创建了相同的字符串时,会去直接指向已有字符串地址

第二种则是,在次基础上并开辟了新空间

还有==是基本数据类型进行比较使用的,然而用在引用数据类型上则是比较地址,不是比较内容
如果想要比较内容时,要用到equals方法,这才是比较内容。




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