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); }