Tin's Blog

You are coming a long way, baby~Thinking, feeling, memory...

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  128 随笔 :: 0 文章 :: 221 评论 :: 0 Trackbacks

hashCode:
他是用来产生hash值的,用在Hashtable上,也包括HashMap等实现。
hashCode的基本约定是:
1、hashCode方法在同一个object上不管被调用了多少次,在同一次执行的Java程序中,hashCode方法必须返回一个持续相同的int。在object被修改时,不给equals方法提供信息。这个int值在同一个程序的两次不同执行过程中(同一程序执行两次),不需要保持恒定。
2、如果两个object通过equals()方法判断相等,则调用它们的hashCode方法应该产生相同的结果。
3、两个通过equals()方法判定不相等的object,调用它们的hashCOde方法并不是必须返回不同的结果。但是,成序言们应该意识到对于不相等的object产生不同的int结果有助于提升hashtables的效率。
一般技术上,通过将object的内部地址转换为integer的方法来产生hashCode,但这不是必需的。

equals:
就是判断是否相等的方法。
基本约定如下:
自反:就是x.equals(x)应该返回true
对称:x.equals(y)返回true则y.equals(x)返回true
传递:x.euqls(y)==true,y.equals(z)==true,那么x.equals(z)也必须返回true
持续性:就是说如果x.equals(y)==true,不管它调用多少次都应该返回true
非空引用:x.equals(null)应该返回false

准则原因这里:
http://java.sun.com/j2se/1.3/docs/api/java/lang/Object.html#hashCode()

在实际Domain中如何实现他们比较好呢?从eclipseWork中的模板生成如下:

public boolean equals(Object rhs) {
        
if (rhs == null{
            
return false;
        }


        
if (!(rhs instanceof Town)) {
            
return false;
        }


        Town that 
= (Town) rhs;

        
if ((this.getId() == null|| (that.getId() == null)) {
            
return false;
        }


        
return (this.getId().equals(that.getId()));
    }

public int hashCode() {
        
if (this.hashValue == 0{
            
int result = 17;
            
int idValue = (this.getId() == null? 0 : this.getId().hashCode();
            result 
= (result * 37+ idValue;
            
this.hashValue = result;
        }


        
return this.hashValue;
    }

下一步还要继续研究,上面的的方法很类似于“Java theory and practice: Hashing it out”
http://www-128.ibm.com/developerworks/java/library/j-jtp05273.html
posted on 2006-02-15 11:34 Tin 阅读(627) 评论(0)  编辑  收藏 所属分类: Hibernate相关

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


网站导航: