在这篇文章中,我们一起来了解一下,java 中的 hashcode() 和 equals() 方法。这两方法可以在 Object.class中找到。依靠这两个方法 object 可以在 HashMap,Hashtable 以及 HashSet 储存和索引。
- hashcode();
- equals();
使用 hashcode()和equals();
hashcode():
hashCode()方法被用来获取给定对象的唯一整数。这个整数被用来确定对象被存储在HashTable类似的结构中的位置。默认的,Object类的hashCode()方法返回这个对象存储的内存地址的编号。
equals():
简单的说就是判断两个对象是否是相同的。类似于"==";
重写 hashcode() 和 equals();
在我们平常的使用中,一般不必要重写这两个方法,只有我们需要比较两个类是否一样的时候,会用到。 让我们来看看下面这个例子 先建个类,Country.java
package org.arpit.javapostsforlearning;
public class Country {
String name;
long population;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public long getPopulation() {
return population;
}
public void setPopulation(long population) {
this.population = population;
}
}
这个类有两个基本属性,name 和 population. 再建立一个类,EqualityCheckMain.java
package org.arpit.javapostsforlearning;
public class EqualityCheckMain {
/**
* @author arpit mandliya
*/
public static void main(String[] args) {
Country india1=new Country();
india1.setName("India");
Country india2=new Country();
india2.setName("India");
System.out.println("Is india1 is equal to india2:" +india1.equals(india2));
}
}
运行看下结果: [task]Is india1 is equal to india2:false [/task]
额,这应该不是我们想要的。我们给 Country 设置了相同的名称。为什么会返回fasle呢? 这是因为 india1 和 india2 分配了不同的内存地址。我们这里可以通过重写 equals()方法来获得我们想要的结果:
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Country other = (Country) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
现在在运行 EqualityCheckMain.java 一次。看看结果
[task]Is india1 is equal to india2:true [/task]
当我们重写 equals()之后,就返回 true了。这里比较了两个内存地址的name 是否相同。
把 Country 对方放入 HashMap:
新建一个类
package org.arpit.javapostsforlearning;
import java.util.HashMap;
import java.util.Iterator;
public class HashMapEqualityCheckMain {
/**
* @author Arpit Mandliya
*/
public static void main(String[] args) {
HashMap<Country,String> countryCapitalMap=new HashMap<Country,String>();
Country india1=new Country();
india1.setName("India");
Country india2=new Country();
india2.setName("India");
countryCapitalMap.put(india1, "Delhi");
countryCapitalMap.put(india2, "Delhi");
Iterator<Country> countryCapitalIter=countryCapitalMap.keySet().iterator();
while(countryCapitalIter.hasNext())
{
Country countryObj=countryCapitalIter.next();
String capital=countryCapitalMap.get(countryObj);
System.out.println("Capital of "+ countryObj.getName()+"----"+capital);
}
}
}
运行一下。你将会看到: [task]Capital of India----Delhi
Capital of India----Delhi [/task]
你会发现,key装入了两个相同的对象。但在hashmap中,key应该是唯一的。这里就是因为这两个对象所分配的内存地址是不同的,hashcode也就不同了。 我们需要重写下这个 hashcode 这个方法:
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
运行看下结果:
[task]Capital of India----Delhi [/task]
现在 hashcode 返回的 india1 和 india2 是一样的了。现在 equals 方法是用 hashcode 返回值来判断是否相等的了。这也就是在 java 文档中提交的:当你重写 equals() 方法的时候,也必须要重写 hashcode() 方法。
关键记忆了
- 如果你重写 equals 方法你必须重写 hashcode 方法。
- 比较两个对象是否相同,就是比较 他们是否有相同的hashcode
- 两个hashcode 相同的对象,不一定是相同的。比如 hashCode();都返回空。并不表示两个对象相等;
- 我们经常比较对象的时候,比较他们的1个属性。比如上面的 name;
英文原文:[weblink url="http://javapostsforlearning.blogspot.in/2014/02/hashcode-and-equals-method-in-java.html"]hashcode() and equals() method in java[/weblink]