对象比较:"==" "equals()" "hashCode()"

原创 2007年10月11日 11:09:00

1.对象和对象引用

 对象:这里指对象实例,其实就是一段内存空间,在new Object()时分配.

 对象引用: 对象引用,其本省不是对象,而是对象实例的引用(可理解为指向对象实内存地址指针)

   假设现有类Apple,有id,name两个属性

   Apple a=new Apple();

   这里 a  只是对象引用,也就是对象引用型变量,它可以引用Apple及其子类的对象实例。

   new Apple()分配的那段地址空间,才是真正的对象,其它都是对它的引用而已

  2,"=="  和 "equals"

   Apple a=new Apple();

   a.setId(9527);

   Apple b=new  Apple();

   b.setId(9527)

   Apple c=b;

  a==b: 就是比较a,b两个引用(a,b不是对象实例),是否引用同一个对象实例,(可理解为是否指向同一段内存空间),因此有以下结论:  a==b,fasle                b==c  :true

  a.equals(b),分两种情况

   如果类Apple没有重写继承自Object基类的equals方法,那么和 "=="一样,比较是否引用同一个对象实例。

  如果重写了equals方法,就要按照Apple类 equals方法的实现逻辑比较了,当然,常规的做法是,重写equals方法,让它判断a,b的值是否相等,下面给一个equals()方法参照实现

  public boolean equals(Object o){
      
if (o instanceof  Apple) {
             Apple apple = (Apple ) o;
             return ((this.id == o.getId));
        }
        return false;

}

 

这里只比较了Apple的Id属性,你也可比较Apple的所有属性是否相等,不过一般只比较唯一属性,就可确定两个实例的值是否相等了。

   注意:sun jdk的很多类,其实已经重写过equals()方法了,比如String,Double,等等。。。

 

3.hashCode()

 建议:如果两个对象实例调用equals()方法比较是相等的,则这两个对象实例的hashCode()方法必须返回相同的整数。否则使用HashMap,Set等时会有问题。

  下面给个参考实现

    public int hasCode() {
        return new java.lang.Integer(sunr).hashCode();

    }

总结:我们自己写的新类,如果需要比较是否相等(值相等),那么就需要重写equals()方法,比较唯一属性是否相等即可.还需要重写hashCode()方法。

 

对象的比较及hashCode、equals方法的使用

如何进行对象的值的比较呢?如String类型的变量,是靠调用equals方法来比较的,而其它的类似数组或普通的对象直接调用equals方法一般是不可以的,这是因为String类型的变量通过调用equa...
  • dfb198998
  • dfb198998
  • 2015年08月18日 09:47
  • 1065

JAVA中自定义对象比较时重写equals()方法的同时要重写hashcode()方法

object对象中的 public boolean equals(Object obj),对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true;注意:当此方法...
  • flysun3344
  • flysun3344
  • 2017年02月16日 16:58
  • 1628

Java中==、equals()和hashCode()的比较分析

在Java语言中,==、equals()、hashCode()这三个方法都和对象的比较有关,
  • taohuaxinmu123
  • taohuaxinmu123
  • 2014年06月17日 10:10
  • 2321

对象相等性——如何给自定义对象添加equals和hashCode方法

转载: 对象相等性——如何给自定义对象添加equals和hashCode方法 每个Java对象都从java.lang.Object继承了一些方法: Tables Are Creationa...
  • showdy
  • showdy
  • 2016年08月05日 18:10
  • 1122

对象的比较,排序,重写equals(),compareTo(),hashCode()方法

import java.util.ArrayList; import java.util.Collections; public class Person implements Comparable{...
  • iceryan
  • iceryan
  • 2013年02月01日 21:42
  • 874

java为什么要重写hashCode和equals方法

如果不被重写(原生)的hashCode和equals是什么样的?       不被重写(原生)的hashCode值是根据内存地址换算出来的一个值。      不被重写(原生)的equals方法是...
  • zknxx
  • zknxx
  • 2016年12月24日 21:17
  • 5748

java中equals()方法与hashCode()方法的隐式调用时的约定详解

首先,想要明白hashCode的作用,必须要先知道Java中的集合。  总的来说,Java中的集合(Collection)有两类,一类是List,再有一类是Set。 前者集合内的元素是有序的,元素可以...
  • sdx1237
  • sdx1237
  • 2017年02月24日 15:37
  • 1074

两个对象用equals方法比较为true,它们的Hashcode值相同吗?

两个对象用equals方法比较为true,它们的Hashcode值相同吗?        答:不一定相同。正常情况下,因为equals()方法比较的就是对象在内存中的值,如果值相同,那么Hash...
  • chwshuang
  • chwshuang
  • 2015年07月18日 17:17
  • 4870

从一道面试题彻底搞懂hashCode与equals的作用与区别及应当注意的细节

从一道面试题彻底搞懂hashCode与equals的作用与区别
  • lijiecao0226
  • lijiecao0226
  • 2014年04月28日 14:24
  • 8526

equals、HashCode与实体类的设计

设计一个标准的实体类四大原则: 1、封装:属性私有化,提供get/set方法等; 2、提供无参构造; 3、重写toString()、HashCode()、equals()这三个方法,(继承自根Obje...
  • yels303
  • yels303
  • 2015年12月29日 22:26
  • 1114
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:对象比较:"==" "equals()" "hashCode()"
举报原因:
原因补充:

(最多只允许输入30个字)