黑马程序员技术交流社区

标题: equals的问题 [打印本页]

作者: wangzhaoxu    时间: 2014-4-14 13:19
标题: equals的问题
Integer n1 = new Integer(1);
Integer n2 = new Integer(1);
n1.equals(n2)返回的是true
但是如果new的类是自己定义的就会返回false?这是什么原因?
作者: 杨殿生    时间: 2014-4-14 13:46
如果是自己定义的类使用equals方法的话,你需要在你自己定义的类中自己去复写equals的方法
作者: Sniper_qiu    时间: 2014-4-14 14:02
Java里面所有的类都间接或直接继承了Object类,而Object类里面有个equals()方法是用来比较对象引用的,所以每个类都继承了equals方法 ,并且一般在自己定义的类里面重写euqals方法以达到需要的目的。你自己定义的类如果没有重写equals方法 那默认使用的就是继承的方法 你new了2个对象 这两个对象的引用显然不同所以返回false。而系统定义的类里面重写了equals方法就不一定是比较对象引用了,比如String类重写equals就是比较字符串是否一样,而不是比较对象引用。TreeSet从类AbstractSet继承了重写的equals方法,比较指定对象与此 set 的相等性。如果给定对象也是一个 set,两个 set 的大小相等,并且给定 set 的每个成员都包含在此 set 中,则返回 true。这确保 equals 方法在 Set 接口的不同实现间正常工作。
作者: 波涛    时间: 2014-4-14 21:20
说起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, 下载次数: 9)

4d9c3fec4af413ed7cb4c&690.jpg





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