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!
以上,不做过多解释了
网友评论