重新计算对象的哈希码
java语言中创建的对象是保存在堆中的,为了提高查找的速度而使用了散列查找。散列查找的基本思想是定义一个键来映射对象所在的内存地址。当需要查找对象时,直接查找键就可以了,这样就不用遍历整个堆来查找对象了。这次我们查看不同对象的散列值。
在项目中创建Cat类,在类中定义4个成员变量分别表示猫咪的名字、年龄、重量和体色,并提供构造方法来设置这些属性值。本类的重点在于重写equals()方法与hashCode()方法。重写equals()方法可以比较两个对象是否相同,重写hashCode()方法可以让相同的对象保存在相同的位置。具体代码如下
package ace;
import java.awt.Color;
public class Cat {
private String name;
private int age;
private double weight;
private Color color;
public Cat(String name,int age,double weight,Color color) {
this.name=name;
this.age=age;
this.weight=weight;
this.color=color;
}
@Override
public boolean equals(Object obj) { //利用属性判断猫咪是否相同
if(this==obj) { //如果两个猫咪是同一个对象则相同
return true;
}
if(obj==null) { //如果两个猫咪中有一个为null则不同
return false;
}
if(getClass()!=obj.getClass()) { //如果两个猫咪的类型不同则不同
return false;
}
Cat cat=(Cat) obj;
return name.equals(cat.name)&&(age==cat.age)
&&(weight==cat.weight)&&(color.equals(cat.color));//比较猫咪的属性
}
@Override
public int hashCode() { //重写hashCode()方法
return 7*name.hashCode()+11*new Integer(age).hashCode()+13
*new Double(weight).hashCode()+17*color.hashCode();
}
}
在ace包中创建Test类文件,在该类的main方法中创建3只猫咪,并为其初始化,然后输出猫咪的哈希码和比较的结果,代码如下
package ace;
import java.awt.Color;
public class Test {
public static void main(String[] args) {
Cat cat1=new Cat("miao",12,21,Color.BLACK);
Cat cat2=new Cat("mi",12,21,Color.WHITE);
Cat cat3=new Cat("miao",12,21,Color.BLACK);
System.out.println("猫咪1号的哈希码:"+cat1.hashCode());
System.out.println("猫咪2号的哈希码"+cat2.hashCode());
System.out.println("猫咪3号的哈希码"+cat3.hashCode());
System.out.println("猫咪1号是否与猫咪2号相同:"+cat1.equals(cat2));
System.out.println("猫咪1号是否与猫咪3号相同"+cat1.equals(cat3));
}
}
最后运行结果如下图所示