是可以的,但是我们一般不能这样做,比如在hashSet集合中。equals相等,而hashCode()方法返回值不等的时候会导致hashSet将这两个对象保存在hashSet的不同位置,从而可以添加成功,这就与Set集合的规则有出入,但是后期操作集合的时候就会比较混乱,
如下程序说明这一点:[code=java]package cn.itcast.heima
import java.util.*;
class R
{
int count;
public R(int count)
{
this.count = count;
}
public String toString()
{
return "R(count属性:" + count + ")";
}
public boolean equals(Object obj)
{
if (obj instanceof R)
{
R r = (R)obj;
if (r.count == this.count)
{
return true;
}
}
return false;
}
public int hashCode()
{
return this.count;
}
}
public class TestHashSet2
{
public static void main(String[] args)
{
HashSet hs = new HashSet();
hs.add(new R(5));
hs.add(new R(-3));
hs.add(new R(9));
hs.add(new R(-2));
//打印TreeSet集合,集合元素是有序排列的
System.out.println(hs);
//取出第一个元素
Iterator it = hs.iterator();
R first = (R)it.next();
//为第一个元素的count属性赋值
first.count = -3;
//再次输出count将看到TreeSet里的元素处于无序状态
System.out.println(hs);
hs.remove(new R(-3));
System.out.println(hs);
//输出false
System.out.println("hs是否包含count为-3的R对象?" + hs.contains(new R(-3)));
//输出false
System.out.println("hs是否包含count为5的R对象?" + hs.contains(new R(5)));
}
}[/code]程序运行结果为:[code=java][R(count属性:5),R(count属性:9),R(count属性:-3),R(count属性:-2),]
[R(count属性:-3),R(count属性:9),R(count属性:-3),R(count属性:-2),]
[R(count属性:-3),R(count属性:9),R(count属性:-2)]
hs是否包含count为-3的R对象?false
hs是否包含count为-5的R对象?false[/code]从上面程序我们可要看出,程序不能正确访问HashSet元素,
所以我们在重写这两个方法的时候要遵循基本规则:
[color=Red]1、当两个对象通过equals方法比较反悔true的时候,这两个对象的hashCode应该相等,
2、当对象用作equals比较标准的属性,都应该用来计算hashCode的值[/color] |