细说Java-hashCode、equals、==区别

1.what?

“==”、”equals()”、”hashCode()”这三个在Java编程找那个是不同而又有密切联系的概念。

  • “==”是操作符
  • “equals”是方法
  • hashCode()”是方法

2.How?

2.1 "=="用法


如果==的两边都是基本类型变量、包装类对象所组成的表达式,==用于比较两边的表达式的值是否相等——只要两边的表达式的值相等,即使数据类不同,该运算符也会返回true。例如'a' == 97.0,将会返回 true。


<code>    @Test
public void t3()
{
boolean b = 'a' == 97.0;
System.out.println(b);
// b = true
}/<code>


如果==的两边是引用类型的变量,==用于判断这两个引用类型的变量是否引用同一块内存,只有当它们引用同一块内存时,==才会返回 true。


<code>    @Test
public void t4()
{
Person p1 = new Person("1");
Person p2 = new Person("1");
Person p3 = p1;

System.out.println(p1==p2);//false
System.out.println(p1==p3);//true
}/<code>


2.2 equals()用法

equals()则是 java.lang.Object 类的一个方法,因此任何 Java 对象都可调用该方法与其他对象进行比较。java.lang.Object 类的 equals 方法的实现代码如下:


<code>  public boolean equals(Object obj) {
return (this == obj);
}/<code>

从上面代码可以看出,如果一个类没有重写 java.lang.Object 的 equals()方法时,此时 equals()方法的比较结果与==的比较结果是相同的

但 Java 允许任何类重写 equals()方法,重写该方法就是让程序员来自己决定两个对象相等的标准

如:


<code>    // Person类 重写equals方法,认为ID相同则是相同的对象
@Override
public boolean equals(Object obj)
{
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (username == null) {
if (other.username != null)
return false;
}
return StringUtils.equalsIgnoreCase(this.getUserid(),other.userid);
}

//测试用例
@Test
public void t4()
{
Person p1 = new Person("1","张三");
Person p2 = new Person("1","李四");

boolean b = p1.equals(p2);// b=true
System.out.println(b);
}
/<code>

上面重写 equals()方法用于判断两个 Person 对象是否“相等”,程序只要两个 Person 对象的 name相等,程序就可以把这两个 Person 对象当成相等(此处一般都根据业务决定)


总结起来就是一句话:开发者重写 equals()方法就可以根据业务要求来决定两个对象是 否“相等”


2.3 hashCode()用法

hashCode()方法也是来自 java.lang.Object 类的native方法,用户生成 Java 对象hashCode值。


3. equals()和hashCode()的不同作用


hashCode()方法与 equals()方法相似,都是来自 java.lang.Object 类的方法,都允许用户定义的子类重写这两个方法。


一般来说,equals()这个方法是给用户调用的,如果你想根据自己的业务规则来判断两个对象是否相等,你可以重写 equals()方法。简单来讲,equals 方法主要是用来判断从表面上看或者从内容上看,两个对象是不是相等

而 hashCode()方法通常是给其他类来调用的,比如当我们要把两个对象放入 HashSet 时, 由于 HashSet 要求两个对象不能相等,而 HashSet 判断两个对象是否相等的标准是通过equals()比较返回 false、或两个对象的 hashCode()方法返回值不相等——只要满足任意一个 条件都可会认为两个对象不相等


从这个角度来看,我们可以把 hashCode()方法的返回值当成这个对象的“标识符”,如果两个对象的 hashCode()相等,即可认为这两个对象是相等的。因此当我们重写一个类的 equals()方法时,也应该重写它的 hashCode()方法,而且这两个方法判断两个对象相等的标 准也应该是一样的


比如两个对象值相同(x.equals(y) == true),但却可以有不同的 hashCode,因为 equals()方法可以由开发者重写,hashCode()方法也可以由开发者来重写,因此它们是否相等并没有必然的关系


分享到:


相關文章: