美文网首页
对象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