美文网首页
对象toString和equals使用lombok的@Data踩

对象toString和equals使用lombok的@Data踩

作者: 一个忙来无聊的人 | 来源:发表于2019-11-29 10:22 被阅读0次

java对象不能直接比较

直接比较是比较的地址,需要重写之后才能达到比较的目的,但是在开发中遇到了一个问题,没有重写也能正常比较

没有重写能正常比较--复现

package com.example.demo.controller;
import lombok.Data;
public class HelloWorld {

    public static void main(String[] args) {
        Demo demo1 = new Demo();
        Demo demo2 = new Demo();
        boolean equals = demo1.equals(demo2);
        System.out.println("两个对象比较是否相等:" + equals);
        /**
         * 两个对象比较是否相等:true
         */
    }

    @Data
    static class Demo {
        private String name;
        private int age;
    }
}

百思不得其姐,这是为什么呢
为了寻找答案,打两个对象转换打印,并探讨

package com.example.demo.controller;

import lombok.Data;
public class HelloWorld {
    public static void main(String[] args) {
        Demo demo1 = new Demo();
        Demo demo2 = new Demo();
        String string1 = demo1.toString();
        String string2 = demo2.toString();
        boolean equals = demo1.equals(demo2);
        System.out.println(string1);
        System.out.println(string2);
        System.out.println("两个对象比较是否相等:" + equals);
  
        /**
         * HelloWorld.Demo(name=null, age=0)
         * HelloWorld.Demo(name=null, age=0)
         * 两个对象比较是否相等:true
         */
    }

   @Data
    static class Demo {
        private String name;
        private int age;
    }
}

原来两个对象toString之后输出的内容居然相同,而且不是按照理解中输出 对象的类名“@”与其十六进制的hashCode连接起来.
回过头来仔细看看,这个demo好像和有点不一样,多了一个 @Data注解。去掉试试

package com.example.demo.controller;
public class HelloWorld {

    public static void main(String[] args) {
        Demo demo1 = new Demo();
        Demo demo2 = new Demo();
        String string1 = demo1.toString();
        String string2 = demo2.toString();
        boolean equals = demo1.equals(demo2);

        System.out.println(string1);
        System.out.println(string2);
        System.out.println("两个对象比较是否相等:" + equals);
        /**
         * 默认输出 -- 将对象的类名路径“@”与其十六进制的hashCode连接起来.
         * com.example.demo.controller.HelloWorld$Demo@6f496d9f
         * com.example.demo.controller.HelloWorld$Demo@723279cf
         * 两个对象比较是否相等:false
         */
    }


    static class Demo {
        private String name;
        private int age;
    }
}

终于找到原因了,使用lombok注解 @Data会使对象一些方法改变

画外音-注解@Data包含内容

@ToString,
@EqualsAndHashCode,
@Getter on all fields
@Setter on all non-final fields
@RequiredArgsConstructor!
以上,不做过多解释了

相关文章

网友评论

      本文标题:对象toString和equals使用lombok的@Data踩

      本文链接:https://www.haomeiwen.com/subject/qdstwctx.html