java的hashcode用来判断对象是否相等

Posted THISISPAN

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java的hashcode用来判断对象是否相等相关的知识,希望对你有一定的参考价值。

HashCode基础

hashCode在JAVA中,代表了对象的一种特征。不同的对象哈希码是不同的。
哈希码是一种数据结构算法,在JAVA中,常见的哈希码算法获取到的哈希码具体值是怎么获取到的呢?
来分析一下:
1.在String类中的hashCode是根据String类中包含的字符串获取的,根据哈希算法获取到一个哈希码,那么只要我的字符内容是相等的,我的哈希码也是相同的。eg:
[java] view plain copy
 
 print?
  1. public static void main(String[] args) {  
  2. String a ="cx";  
  3. String b = "cx";  
  4. System.out.println(b.hashCode()==a.hashCode());  
  5.     }  
结果我想大家已经猜到了,true!
 
2.Integer类中的hashCode和String是一样的,也是根据类中包含的值去生成的哈希码。两个相同大小的integer值,那么它的hashCode也是相等的。eg:
[java] view plain copy
 
 print?
  1. Integer a =11;  
  2.         Integer b = 11;  
  3.         System.out.println(b.hashCode()==a.hashCode());  
结果还是true!
 
3.Object类中的hashCode则和之前的不一样了,他是根据对象的内存地址经过哈希算法之后获取到的哈希码,由于每个对象的内存地址不相同,所以hashCode是不同的。
 
 
我们常常会去用hashCode和equals去判断对象是否相等!
 
在Hashtable、HashMap、HashSet、LinkedHashMap中,我们去判断集合中是否有相同的对象,我们就要去重写对象的hashCode和equals来帮助我们获取到集合中相同的对象!
在上述的Hash运用的集合里面,执行操作时,都会自动执行对象的hashCode方法。去进行判断是否是同一个对象。
 
**如HashMap在put的时候key不能相同,那么在我添加对象到key的时候就会去调用hashcode和equals方法,去判断是否是同一个对象,如果不是那么就加入集合,是的话则不加入。
所以我们重写hashCode,可以return 一个对象的uuid.hashCode()这样去进行判断
 
HashSet也是如此,原理是相同的。
[java] view plain copy
 
 print?
  1. Map<StaticTest, String> map = new HashMap<StaticTest, String>();  
  2.     StaticTest st = new StaticTest();  
  3.     st.setI(55);  
  4.     st.setName("cx");  
  5.     map.put(st, "OK");  
  6.     Set<StaticTest> set = map.keySet();  
  7.     StaticTest obj = new StaticTest();  
  8.     obj.setI(55);  
  9.     obj.setName("cx1");  
  10.     map.put(obj, "OK");  
  11.     for (StaticTest staticTest : set) {  
  12.         System.out.println(staticTest.getName());  
  13.     }  
  14. }  
重写的hashCode()和equals():
[java] view plain copy
 
 print?
  1. @Override  
  2. public int hashCode() {  
  3.     System.out.println("执行hashCode");  
  4.     return i.hashCode();  
  5. }  
  6.   
  7. @Override  
  8. public boolean equals(Object obj) {  
  9.     System.out.println("equals");  
  10.     if(this.getClass() == obj.getClass()){  
  11.         return i.equals(((StaticTest)obj).getI());  
  12.     }  
  13.     return false;  
  14. }  

最终输出的结果是cx,map里面就一个对象,就是我第一次添加的那个。第二次添加的由于i是相同的所以判断它们是同一个对象,就没有被Put进去!!!!
本文转自http://blog.csdn.net/qq_25223941/article/details/49905941,感谢原作者

以上是关于java的hashcode用来判断对象是否相等的主要内容,如果未能解决你的问题,请参考以下文章

Java中如何判断两个对象是否相等(Java equals and ==)

Java面试题:hashCode() 和 equals()

hashcode()与equals()方法(第8周)

Java中hashCode¥equals¥==的区别

Java hashCode() 和 equals()的若干问题解答

关于判断对象是否相等的问题