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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© nihaoshitou 中级黑马   /  2013-5-11 10:23  /  2445 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

求大神指点粤详细越好!谢了!

11 个回复

倒序浏览
我是来看头像的。
回复 使用道具 举报
Friendy89 来自手机 中级黑马 2013-5-11 10:29:58
藤椅
 ==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。

     如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如Objet obj = new Object();变量obj是一个内存,new Object()是另一个内存,此时,变量obj所对应的内存中存储的数值就是对象占用的那块内存的首地址。对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,即要看这两个变量所对应的内存中的数值是否相等,这时候就需要用==操作符进行比较。

     equals方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。例如,对于下面的代码:

     String a=new String("foo");

     String b=new String("foo");

     两条new语句创建了两个对象,然后用a,b这两个变量分别指向了其中一个对象,这是两个不同的对象,它们的首地址是不同的,即a和b中存储的数值是不相同的,所以,表达式a==b将返回false,而这两个对象中的内容是相同的,所以,表达式a.equals(b)将返回true。

     在实际开发中,我们经常要比较传递进行来的字符串内容是否等,例如,String input = …;input.equals(“quit”),许多人稍不注意就使用==进行比较了,这是错误的,随便从网上找几个项目实战的教学视频看看,里面就有大量这样的错误。记住,字符串的比较基本上都是使用equals方法
回复 使用道具 举报
本帖最后由 fjl_fight 于 2013-5-11 11:04 编辑

==是用于数值(基本数据类型)比较和地址比较
equals是用于比较内容,跟地址没关系
  1. String str1="abc";
  2.                 String str2="abc";
  3.                 String str3="ab";
  4.                 str3=str1;
  5.                 String str4=new String("abc");
  6.                 String str5=new String("abc");
  7.                
  8.                 System.out.println(str1==str2);//true
  9.                 System.out.println(str1==str3);//true
  10.                 System.out.println(str2==str3);//true
  11.                 System.out.println(str1==str4);//false
  12.                 System.out.println(str2==str4);//false
  13.                 System.out.println(str3==str4);//false
  14.                 System.out.println(str5==str4);//false
  15.                
  16.                 System.out.println("******************************");
  17.                
  18.                 System.out.println(str1.equals(str2));//true
  19.                 System.out.println(str1.equals(str3));//true
  20.                 System.out.println(str2.equals(str3));//true
  21.                 System.out.println(str1.equals(str4));//true
  22.                 System.out.println(str2.equals(str4));//true
  23.                 System.out.println(str3.equals(str4));//true
  24.                 System.out.println(str5.equals(str4));//true
复制代码
上述代码的内存解析,用new实例化的都会在堆中开辟新的空间

评分

参与人数 1技术分 +1 收起 理由
曹睿翔 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
本帖最后由 chouwayメ 于 2013-10-8 22:42 编辑

==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。  equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。
总的说:java中equals和==的区别  ==比较的是2个对象的地址,而equals比较的是2个对象的内容
而对于
String a=new String("abc");String b={"abc"};
System.out.println("a=b?:"+a==b);
System.out.println("a equals b?:"+a.equals(b));
则结果是:第一个false,第二个是true.
因为这里涉及到一个String对象因创建方式的不同而采取存储的方式不同。详细参见http://bbs.itheima.com/thread-48732-1-1.html
回复 使用道具 举报
==操作符用于基本数据类型时比较的是数值是否相等,用于引用数据类型时比较的是引用(测试两个引用是否指向同一个对象)。
equals方法先在上帝类中定义,用于比较两个对象的哈希地址值是否相等,该方法不能用于基本数据类型,因为它们不是对象。如果需要用equals方法比较两个对象的内容是否相等,则要在对象所属的类中复写equals方法,以实现你想比较的内容。
回复 使用道具 举报
rosv 中级黑马 2013-5-11 11:13:06
7#
在没有重写Object类中的equals方法时,所有对象比较的都是地址,看看Object类中equals的源码
  public boolean equals(Object obj) {
        return (this == obj);
    }
没有重写Object类中的equals方法,两对象比较时和==没有区别,不过==用的更广泛,它可以比较基本类型,二equals只能比较对象,注意基本类型的包装类重写了Object的
equals方法,你也可以自定义equals的比较规则,只要重写Object的equals方法就可以了。。。
回复 使用道具 举报
李瑞 中级黑马 2013-5-11 11:19:02
8#
对于字符串变量来说,使用“==”和“equals()”方法比较字符串时,其比较方法不同。“==”比较两个变量本身的值,即两个对象在内存中的首地址。
对于非字符串变量来说,"=="和"equals"方法的作用是相同的都是用来比较其对象在堆内存的首地址,即用来比较两个引用变量是否指向同一个对象。
如果是基本类型比较,那么只能用==来比较,不能用equals
对于基本类型的包装类型,比如Boolean、Character、Byte、Shot、Integer、Long、Float、Double等的引用变量,==是比较地址的,而equals是比较内容的
回复 使用道具 举报
其实这个问题问的人已经很多了 论坛中这个问题的贴子也很多了  
我说最简单好理解了  

1.== 可以用来比较   基本数据类型  和 引用数据类型(对象)
当==比较 基本数据类型时 比较的是他们的值是否相等。 相等为true 不相等为flase;
当==比较 引用数据类型时 比较的是他们的对象在堆内存的首地址, 相同为true  不相同为flase;

2.equals 不可以用来比较基本数据类型, 用来比较引用数据类型(对象)。
其实equals在没有复写的情况下和==是等价的(equals是Object的方法),都是比较的他们的对象在堆内存的首地址。
可以自定义比较方式来复写equals    比如String类在用equals比较时就是比较的他们对象的值是否相等,因为String类中的equals方法被java本身复写了





回复 使用道具 举报
==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。
equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。
就好像说人的长相,==比较的是两个人的长相是否一样,而equals比较的是两个人是否是同一个人,
回复 使用道具 举报
朋友你好,这个问题有人发过帖子哦。我也回答过了。
==是关系运算符。
equals方法在object类中用于比较两个对象的地址值的。
回复 使用道具 举报
及时更改问题状态,点编辑改为已解决
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马