首页 文章

我想要序列化对象时是否需要覆盖哈希码和等号?

提问于
浏览
1

我已经看到一些开发人员在POJO对象中覆盖equals和hashcode,这些对象实现了serializable,而其他人没有 . 关于在实现可序列化时我是否应该在POJO中覆盖equals和hashcode,我很困惑?我的POJO就像一个人对象,我想将它保存到Redis数据库 .

import java.io.Serializable;
public class Person implements Serializable {
    private static final long serialVersionUID = 1L;
    private int id;
    private String name;
    private int age;
    public Person() { }
    public Person(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String toString() {
                return id +" - " + name + " - " + age;
    }
        @Override
        public boolean equals(final Object obj) {
           if (obj == null) {
               return false;
           }
           final Person person = (Person) obj;
           if (this == person) {
               return true;
           } else {
               return (this.name.equals(person.name) && this.age == person.age);
           }  
        }
        @Override
        public int hashCode() {
           int hashno = 7;
           hashno = 13 * hashno + (name == null ? 0 : name.hashCode());
           return hashno;
        }
}

1 回答

  • 0

    没有严格的规则,类实现 serializable 需要覆盖 equals()hashCode()

    If you Override Only hashcode

    如果只覆盖哈希码方法,则不会发生任何事情 . 因为它总是为每个对象返回新的hashCode作为Object类 .

    If you Override only equals

    如果你只覆盖相等的方法,a.equals(b)为真,这意味着a和b的hashCode必须相同但不会发生

    这取决于用例和开发人员覆盖 .equals() 方法,这样便于检查两个人对象是否具有相同的内容

    始终建议在覆盖equals()的每个类中重写hashCode() .

    From Google 无法覆盖哈希码here

    您必须覆盖覆盖等于的每个类中的hashCode . 如果不这样做将导致违反Object.hashCode的一般 Contract ,这将阻止您的类与所有基于散列的集合(包括HashMap,HashSet和Hashtable)一起正常运行 . 2013年1月31日

相关问题