HashCode()方法只是在HashSet集合中才能体现出他的作用,HashSet集合用的是Hash算法来快速查找对象,所以shCode()就好比集合元素的索引
其实关于重写equals方法比较普遍,但是在用到HashSet集合的时候就会需要重写这个方法的时候还需要重写hashCode()方法,
简单的说HashSet存储一个元素的时候,HashSet会调用HashCode()方法来得到该对象的HashCode()返回值,再根据这个返回值来决定这个对象存储在HashSet的位置,如果两个元素通过equals比较返回true,但他们的hashCode()返回值不相等,HashSet会把他们存储在不同的位置,也就可以添加成功
[color=Red]也就是说HashSet判断两个集合相等的标准是两个对象通过equals方法比较相等,并且两个对象的HashCode()返回值也相等[/color]
例如如下例子,一个重写HashCode()一个重写equals 最后一个重写两个方法[code=java]package cn.itcast.zhanjc;
import java.util.*;
/**
*
*/
//类A的equals方法总是返回true,但没有重写其hashCode()方法
class A
{
public boolean equals(Object obj)
{
return true;
}
}
//类B的hashCode()方法总是返回1,但没有重写其equals()方法
class B
{
public int hashCode()
{
return 1;
}
}
//类C的hashCode()方法总是返回2,但没有重写其equals()方法
class C
{
public int hashCode()
{
return 2;
}
public boolean equals(Object obj)
{
return true;
}
}
public class HashCode
{
public static void main(String[] args)
{
HashSet books = new HashSet();
//分别向books集合中添加2个A对象,2个B对象,2个C对象
books.add(new A());
books.add(new A());
books.add(new B());
books.add(new B());
books.add(new C());
books.add(new C());
System.out.println(books);
}
}[/code]结果[code=java][cn.itcast.zhanjc.B@1, cn.itcast.zhanjc.B@1, cn.itcast.zhanjc.C@2, cn.itcast.zhanjc.A@1fb8ee3, cn.itcast.zhanjc.A@c17164][/code]------------------------------------------------------------------------------------
从上可以看到当重写一个equals或者hashCode()时候集合能添加通过equals方法返回true的元素、并且虽然HashCode()方法返回true但是HashSet依然把他们当成两个对象、这样就与Set集合规则不符合
所以在重写HashCode()方法的基本原则上要注意:
1、当两个对象通过equals方法返回true时,这两个对象的HashCode()也应该相等
2、对象中用作equals比较标准的属性都应该用来计算HashCode的值 |