@EqualsAndHashCode 和set集合
时间: 2023-11-14 10:07:36 浏览: 44
@EqualsAndHashCode 是一个注解,可以用于自动生成 equals() 和 hashCode() 方法。在使用该注解时,会自动根据类中定义的属性生成 equals() 和 hashCode() 方法,从而避免手动编写这些方法时可能出现的错误。
set 集合是 Java 中的一种集合类型,它不允许重复元素存在。当向 set 集合中添加元素时,如果该元素已经存在于集合中,则添加操作会失败。
在使用 @EqualsAndHashCode 注解时,需要注意以下几点:
1. 如果类中有不需要参与 equals() 和 hashCode() 比较的属性,可以使用 @EqualsAndHashCode.Exclude 注解进行排除。
2. 如果类中有需要特殊处理的属性,可以使用 @EqualsAndHashCode.Include 注解进行指定。
3. 在使用 @EqualsAndHashCode 注解时,需要保证生成的 equals() 和 hashCode() 方法符合相应的规范,否则可能会出现意想不到的问题。
相关问题
@EqualsAndHashCode()
@EqualsAndHashCode()是一个注解,用于在Java中生成equals()和hashCode()方法。它可以自动生成基于类的属性的比较逻辑,从而简化了代码编写过程。
以下是@EqualsAndHashCode()的一些常见用法:
1. 默认用法:不指定任何属性,默认情况下,@EqualsAndHashCode()会使用非静态、非瞬态的所有属性来生成equals()和hashCode()方法。
2. 指定callSuper属性:通过设置callSuper属性为true,可以在子类中使用父类的属性来生成equals()和hashCode()方法。
3. 指定exclude属性:通过设置exclude属性,可以排除某些属性不参与equals()和hashCode()方法的生成。
4. 指定of属性:通过设置of属性,可以指定只使用某些属性来生成equals()和hashCode()方法。
下面是一个示例代码,演示了@EqualsAndHashCode()的用法:
```java
import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true, exclude = "weight")
class Animal {
private String name;
private int weight;
}
@EqualsAndHashCode(callSuper = true, of = "name")
class Cat extends Animal {
private String color;
}
public class Main {
public static void main(String[] args) {
Animal animal1 = new Animal();
animal1.setName("Tom");
animal1.setWeight(10);
Animal animal2 = new Animal();
animal2.setName("Tom");
animal2.setWeight(20);
Cat cat1 = new Cat();
cat1.setName("Tom");
cat1.setColor("Black");
Cat cat2 = new Cat();
cat2.setName("Jerry");
cat2.setColor("White");
System.out.println(animal1.equals(animal2)); // 输出:false
System.out.println(cat1.equals(cat2)); // 输出:false
}
}
```
在上面的示例中,Animal类和Cat类都使用了@EqualsAndHashCode()注解。Animal类使用了exclude属性排除了weight字段,而Cat类使用了of属性指定了只使用name字段。通过调用equals()方法,我们可以看到不同情况下的比较结果。
@EqualsAndHashCode(callSuper = true) @ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)注解用于子类对象之间进行比较的时候,equals和hashcode将父类对象属性算进去,根据父类和子类共同的属性去比较。而@ToString(callSuper = true)注解则是将父类中的属性也算到toString中。
举个例子,假设有一个父类Person和一个子类Student,它继承了Person类。Person类中有两个属性:name和age。Student类中有一个属性:score。如果我们在Student类中使用@EqualsAndHashCode(callSuper = true)和@ToString(callSuper = true)注解,那么在比较两个Student对象时,会将父类Person中的name和age属性也算进去。在调用toString方法时,也会将父类中的属性一并输出。
示例代码如下:
```java
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
@Data
class Person {
private String name;
private int age;
}
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
class Student extends Person {
private int score;
}
public class Test {
public static void main(String[] args) {
Student s1 = new Student();
s1.setName("Tom");
s1.setAge(18);
s1.setScore(90);
Student s2 = new Student();
s2.setName("Tom");
s2.setAge(18);
s2.setScore(90);
System.out.println(s1.equals(s2)); // 输出:true
System.out.println(s1.toString()); // 输出:Student(super=Person(name=Tom, age=18), score=90)
}
}
```