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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 范天成 中级黑马   /  2013-1-22 23:27  /  1720 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张向辉 于 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

评分

参与人数 1技术分 +1 收起 理由
黄锦成 + 1

查看全部评分

7 个回复

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

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

还有==是基本数据类型进行比较使用的,然而用在引用数据类型上则是比较地址,不是比较内容
如果想要比较内容时,要用到equals方法,这才是比较内容。
回复 使用道具 举报
首先你必须明白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了!

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1 赞一个!

查看全部评分

回复 使用道具 举报
同意上面版主的看法,什么问题不要开始就发帖问,首先得自己找找看下有没有类似的问题,如果木有在发帖询问。
回复 使用道具 举报
论坛充斥着这种==和equals的区别的帖子。。你有搜过再发帖么?
回复 使用道具 举报
  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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄锦成 + 1 赞一个!

查看全部评分

回复 使用道具 举报
String str1= new String("abc");      
String str2 = new String("abc");     

这种方式每次都会在堆中创建一个新的对象,str1跟str2分别指向各自创建的对象,自然返回是false
回复 使用道具 举报
本帖最后由 低调的奢华 于 2013-1-22 23:39 编辑

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

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

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

所以,你懂的!

评分

参与人数 1技术分 +1 收起 理由
黄锦成 + 1

查看全部评分

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