目录
一、先说结论
1. equals的分析与结论
equals分析:
equals(Object obj)方法是Object超类中的方法,比较的是对象在内存中是否为同一个对象,即比较的是地址值(equals方法默认比较的是对象的引用是否相等);
String类中的equals方法对Object超类中的equals方法进行了重写,比较的是两个字符串的值本身(即字面量)是否相等;
equals结论:
- 自定义的类:如果没有重写equals方法时,比较的当然是两个对象的引用是否相等;如果想比较对象本身是否相等时,需要重写equals方法自定义比较逻辑;
- 字符串的比较:String.java类重写了equals方法,所以字符串比较时,比较的是值是否相等【再如Integer类也重写了equals方法】。
2. ==的结论
- ==比较8大基本数据类型时:比较的是值本身是否相等;
- ==比较引用类型时(String属于引用类型):比较的是地址值。
3. 应用举例
String a = "saff";
String b = "saff";
String c = new String("saff");
System.out.println(a.equals(b)); // true
System.out.println(a.equals(c)); // true
System.out.println(a == b); // true
System.out.println(a == c); // false
分析:上面a、b、c都是字符串类型,所以对于字符串类型,==比较的就是地址值是否相等,equals比较的就是值本身是否相等。a、b都在常量池中,内存地址的指向相同,而new的对象c在堆中。
二、GitCode AI的回答
三、@Data注解扩展
@Data
是Lombok库提供的一种注解,它能自动为Java类生成getter、setter、equals、hashCode和toString等常见方法。这样可以避免在类中手动编写这些重复的代码,从而让代码更简洁且易于维护。@Data
默认还会生成一个无参构造方法,不过这可以被其他配置改变。(以前只知道该注解自动生成了,却不知道还自动生成了equals、hashCode、toString和一个无参构造,验证过了,的确如此)
除了@Data,Lombok还有哪些常用的注解?
Lombok提供了许多其他的注解,用于简化Java代码。以下是一些常用的Lombok注解:
@NoArgsConstructor
: 生成一个无参数的构造器。@AllArgsConstructor
: 生成一个包含所有字段的构造器。@RequiredArgsConstructor
: 生成一个包含所有带有final修饰符或标注了@NonNull
(需要引入额外依赖)的字段的构造器。@NonNull
: 标记一个字段为非空,通常与@AllArgsConstructor
一起使用。@Getter
和@Setter
: 分别生成getter和setter方法,只针对指定的字段或类的所有字段。@Log
,@Log4j
,@Logback
: 自动添加日志对象,如Logger log = Logger.getLogger(this.getClass());
@ToString
: 生成toString()
方法,列出所有字段。@EqualsAndHashCode
: 生成equals()
和hashCode()
方法,可以选择是否包括所有字段。@Cleanup
: 在try/catch块中自动关闭资源。@Synchronized
: 将方法或块同步化。@Builder
: 生成构建者模式的代码,方便创建复杂对象。@Value
: 类似于@Data
,但是默认所有的字段都是final并不可变的。