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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wangzhaoxu 初级黑马   /  2014-4-14 13:19  /  948 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

Integer n1 = new Integer(1);
Integer n2 = new Integer(1);
n1.equals(n2)返回的是true
但是如果new的类是自己定义的就会返回false?这是什么原因?

3 个回复

正序浏览
说起equals就得提到“==” ,这两个是有区别的。
"==" 是判断符号两边的对象是否相等,即它们的内存地址是否相等;
equals() 是判断两个对象的值是否相等,而不管它们的内存地址是否相等.(当然,若它们的内存地址相等,值一定相等);以下是典型示例:
  1. public class Test2 {
  2. public static void main(String[] args) {
  3. String str1 = "apple"; ⁄*先查看字符串池里有没有这个值,若没有,则开辟一个空间用来存放这个值*/
  4. String str2 = "apple"; ⁄*先查看字符串池里有没有这个值,若有,则str2指向这个内存地址*/
  5. System.out.println("str1==str2:"+(str1==str2));  ⁄*因为str1与str2的内存地址一样,所以"=="的结果为true*/
  6. System.out.println("str1 equals str2:"+str1.equals(str2));

  7. String str3 = new String("banana");
  8. String str4 = new String("banana"); ⁄*分别创建了两个不同的字符串对象,str3和str4*/
  9. System.out.println("str3为"+str3+"\nstr4为"+str4);
  10. System.out.println("str3==str4:"+(str3==str4));
  11. System.out.println("str3 equals str4:"+(str3.equals(str4)));
  12. ⁄*str3和str4分别代表两个不同的内存地址,所以"=="的结果为false*/
  13. ⁄*这时应该看得出String类型的两种创建对象的方法之间的区别了吧!要注意的是第一种创建对象方法采用的池技术对象的值可以重复利用*/

  14. int i1 = 10;
  15. int i2 = 10;
  16. System.out.println("i1==i2:"+(i1==i2));
  17. ⁄*为什么结果为true?本人的理解是:int只是一个基本数据类型,不是一个封装类型.而它的封装类型Integer则符合上面的原理请看下面代码*/

  18. Integer integer1 = new Integer(10);
  19. Integer integer2 = new Integer(10);
  20. System.out.println("integer1==integer2:"+(integer1==integer2));
  21. System.out.println("integet1 equals integer2:"+integer1.equals(integer2));

  22. Object obj1 = new Object();
  23. Object obj2 = obj1;
  24. System.out.println("obj1==obj2:"+(obj1==obj2));
  25. //对象obj1和obj2都指向同一个内存地址.
  26. }
  27. }
复制代码





4d9c3fec4af413ed7cb4c&690.jpg (67.85 KB, 下载次数: 11)

4d9c3fec4af413ed7cb4c&690.jpg

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
Java里面所有的类都间接或直接继承了Object类,而Object类里面有个equals()方法是用来比较对象引用的,所以每个类都继承了equals方法 ,并且一般在自己定义的类里面重写euqals方法以达到需要的目的。你自己定义的类如果没有重写equals方法 那默认使用的就是继承的方法 你new了2个对象 这两个对象的引用显然不同所以返回false。而系统定义的类里面重写了equals方法就不一定是比较对象引用了,比如String类重写equals就是比较字符串是否一样,而不是比较对象引用。TreeSet从类AbstractSet继承了重写的equals方法,比较指定对象与此 set 的相等性。如果给定对象也是一个 set,两个 set 的大小相等,并且给定 set 的每个成员都包含在此 set 中,则返回 true。这确保 equals 方法在 Set 接口的不同实现间正常工作。

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

回复 使用道具 举报
如果是自己定义的类使用equals方法的话,你需要在你自己定义的类中自己去复写equals的方法
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马