首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

erquals()跟hashcode()

2012-12-24 
erquals()和hashcode()hashCode:他是用来产生hash值的,用在Hashtable上,也包括HashMap等实现。hashCode的基

erquals()和hashcode()
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;
    }

热点排行