java类hashcode()、equals()、toString()方法

java中Object类中都有hashcode()、equals()、toString()这三个方法,因此java中所有的类中都有这三个方法。

在Object类中toString()方法的实现是打印对象的地址,这个打印出来人类是看不懂的,这个信息打印出来没有什么用处。所以在Effective Java这本书中,作者推荐我们尽量重写这个方法,使其打印出有用的信息。实现toString()方法是一个机械的繁琐的工作,所以我们应该借助成熟的类库来帮忙。java阵营中著名的类库guava可以很好的帮助我们完成这个工作。以下是代码示例:

    @Override
    public String toString() {

        return MoreObjects.toStringHelper(this)
            .add("houseNumber", houseNumber)
            .add("street", street)
            .toString();

    }

如果我们设计的类要与hashmap、hashset一起工作,涉及到hash值得操作。那么就需要重写hashcode()、equals()方法,而且这两个方法必须一起重写,如果只写其中的一个会出现难以描绘的错误。而且这两个方法要一致。在java7之前这个工作还是有一定难度的,因为生成高效的hash值是一个困难的工作。所以在java7之前实现这两个方法,最好借助于成熟的类库,比如guava。但是java7之后,java把guava中这两个工具方法加到了标准类库中,因此我们可以直接使用。以下是代码示例:

    @Override
    public boolean equals(Object obj) {

        if (obj == null) return false;
        if (obj == this) return true;
        if (!(obj instanceof Address)) return false;
        final Address other = (Address) obj;
        return Objects.equal(this.houseNumber, other.houseNumber)
            && Objects.equal(this.street, other.street)
            && Objects.equal(this.city, other.city)
            && Objects.equal(this.stateOrProvince, other.stateOrProvince)
            && Objects.equal(this.country, other.country);

    }

    @Override
    public int hashCode() {

        return Objects.hashCode(
            this.houseNumber, this.street, this.city, this.stateOrProvince, this.country);

    }

 

posted @ 2017-05-19 20:45  遮阳伞  阅读(1159)  评论(0编辑  收藏  举报