zhyiwww
用平实的笔,记录编程路上的点点滴滴………
posts - 536,comments - 394,trackbacks - 0
hashcode,一个不太好理解,也常被我们忽视的一个概念。然而,hashcode还有对我们有用的东西。
java给我们提供了两种判断对象对等的方式。如果我们判断两个对象是否相等,那么直接用“==”运算就可以了。然而,判断两个对象对等,就没有那么简单了。
在java中,我们常常通过equals()方法来判断两个对象的对等。其实,我么还可以通过hashCode()来判断两个对象的对等。

看下面的例子:

import java.util.List;

public class MyBag{
    float money;
    List books;  
}
我们如何判断两个MyBag对象是对等的呢?也就是说,如果有两个MyBag的对象bag1和bag2,通过什么的办法能说明这个两个对象是相同的呢?
先声名两个概念:
两个对象相等,指的是,两个引用指向了同一个对象,也就是说,指向了内存中的同一个地址。
两个对象相同(对等),指得是两个对象的任何属性都相等,但是,不是一个对象。

所以,对于上面的MyBag的对象对等,那么,两个对象的money要一样,同时,books要对等。那么如何去判断呢?我们通常会自己去实现equals()方法去判断,方法如下:

    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        final MyBag other = (MyBag) obj;
        if (books == null) {
            if (other.books != null)
                return false;
        } else if (!books.equals(other.books))
            return false;
        if (Float.floatToIntBits(money) != Float.floatToIntBits(other.money))
            return false;
        return true;
    }

我们也可以通过实现hashCode()来实现:
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((books == null) ? 0 : books.hashCode());
        result = prime * result + Float.floatToIntBits(money);
        return result;
    }

那么我们判断两个对象对等时,就可以这样来实现了:
if(bag1.equals(bag2)){
    // 对等
}

或者
if(bag1.haseCode()==bag2.hashCode()){
    // 对等
}

为什么这种方式也能判断两个对象对等呢?
因为,任何一个对象的hashCode是唯一的,并且和气对象属性按照一定的规则相关的。

比如,一个Integer的hashCode值就是其整数值,因为Integer的haseCode()是这样实现的:
    public int hashCode() {
        return value;
    }
    public boolean equals(Object obj) {
        if (obj instanceof Integer)
            return value == ((Integer) obj).intValue();
        else
            return false;
    }

由此可以看到,也对象的HashCode是和其属性有一定的联系,规则和属性的值有一定的联系,这个规则决定了有相同的hashcode,就有两个对象的属性对等。



|----------------------------------------------------------------------------------------|
                           版权声明  版权所有 @zhyiwww
            引用请注明来源 http://www.blogjava.net/zhyiwww   
|----------------------------------------------------------------------------------------|
posted on 2008-04-22 18:03 zhyiwww 阅读(1360) 评论(1)  编辑  收藏 所属分类: java basic

FeedBack:
# re: 对hashCode的一点简单认识
2008-04-23 16:48 | 懒人
那hashtable是什么用的?  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: