在这篇文章中,咱们一块儿来了解一下,java 中的 hashcode() 和 equals() 方法。这两方法能够在 Object.class中找到。依靠这两个方法 object 能够在 HashMap,Hashtable 以及 HashSet 储存和索引。html
hashCode()方法被用来获取给定对象的惟一整数。这个整数被用来肯定对象被存储在HashTable相似的结构中的位置。默认的,Object类的hashCode()方法返回这个对象存储的内存地址的编号。java
简单的说就是判断两个对象是不是相同的。相似于"==";web
在咱们日常的使用中,通常没必要要重写这两个方法,只有咱们须要比较两个类是否同样的时候,会用到。 让咱们来看看下面这个例子 先建个类,Country.javaapi
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.javaide
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]post
额,这应该不是咱们想要的。咱们给 Country 设置了相同的名称。为何会返回fasle呢? 这是由于 india1 和 india2 分配了不一样的内存地址。咱们这里能够经过重写 equals()方法来得到咱们想要的结果:this
@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 一次。看看结果url
[task]Is india1 is equal to india2:true [/task]code
当咱们重写 equals()以后,就返回 true了。这里比较了两个内存地址的name 是否相同。htm
新建一个类
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() 方法。
英文原文:[weblink url="http://javapostsforlearning.blogspot.in/2014/02/hashcode-and-equals-method-in-java.html"]hashcode() and equals() method in java[/weblink]