@Data 重写hashcode和equals

@Data
//@EqualsAndHashCode(callSuper=true)
public class UcsAccountLog extends  BaseVO implements Serializable {

    private static final long serialVersionUID = 1L;

    private String id;
    
}
@Data
public class BaseVO {
    public String version;
}

说明:

@Data注解包含了

* @see Getter
* @see Setter
* @see RequiredArgsConstructor
* @see ToString
* @see EqualsAndHashCode
* @see lombok.Value

这些注解

@Data就包含了EqualsAndHashCode 重写了hashcode和equals方法

/**
     * 首先,是为了支持哈希表类的如之类的底层使用了哈希表的类。
     * Java Object规范中int hashCode()方法的约定类容有三个:
     * <p>
     * (1)              只要对象的equals方法所用到的信息没有修改,那么hashCode方法必须始终如一的返回一个同一整数,在同一应用程序中多次执行中,每一次执行可以不一样。
     * <p>
     * (2)              如果两个对象的equals方法想到,那么每一个对象单独调用hashCode返回的数字必须相等。
     * <p>
     * (3)              如果两个对象的equals方法不相等,hashCode方法的返回值可以相等,给不同的对象返回不同的值可以提高哈希表的性能。
     * 所有重写 equals的同时 必须重写hashcode
     * @param args
     */
    public static void main(String[] args) {
        UcsAccountLog ucsAccountLog = new UcsAccountLog();
        ucsAccountLog.setVersion("1");
        ucsAccountLog.setId("2");
        UcsAccountLog ucsAccountLog2 = new UcsAccountLog();
        ucsAccountLog2.setVersion("2");
        ucsAccountLog2.setId("2");
        HashSet set = new HashSet();
        set.add(ucsAccountLog);
        set.add(ucsAccountLog2);
        System.out.println(set.size());//1
        System.out.println(ucsAccountLog.hashCode() == ucsAccountLog2.hashCode());//true  因为重写了hashcode 所有这里hashcode是相等的
        //如果没有重写 hashcode是根据内存地址值
        System.out.println(ucsAccountLog.equals(ucsAccountLog2));//true
        //根据hash
        System.out.println(ucsAccountLog == ucsAccountLog2);//false  ==比较的是对象的地址

    }

为什么结果是这样的  因为@EqualsAndHashCode默认不继承父类 就是说 重写hashcode和equals的时候 不包含父类的字段值

所有只会比较自己对象里面的字段值  显然这是错误的

所有我们需要添加注解:

@EqualsAndHashCode(callSuper=true)

加上这个注解就可以了  在次执行 上面代码执行结果如下:

2
false
false
false

猜你喜欢

转载自blog.csdn.net/liuqiang211/article/details/88741234