Pourquoi l'objet cloné a-t-il le même hashcode que l'objet d'origine après la modification de la classe par @Data ?

En tapant du code récemment, j'ai trouvé un phénomène étrange ?

@Data
public class Person implements Cloneable{
    private Integer num;
    private String jobName;

    @Override
    public Person clone() throws CloneNotSupportedException {
        return (Person)super.clone();
    }
}

Une fois que la personne a implémenté Cloneable, l'objet généré en appelant la méthode clone a le même code de hachage que l'objet source.

Nous savons que l'utilisation de la méthode clone de Object renverra un nouvel objet, qui est le même que l'objet source, mais l'adresse est différente, donc le hashcode représentant l'adresse doit être différent.

Plus tard, j'ai vérifié la classe Person compilée dans le dossier cible pour savoir que la classe modifiée par @Data fournira les méthodes get, set, equals, hashCode et toString de la classe. La méthode de hashcode réécrite calcule le hashcode en fonction de la valeur de l'attribut de la classe, de sorte que le hashcode des deux sera le même après la copie.

    public int hashCode() {
        int PRIME = true;
        int result = 1;
        Object $num = this.getNum();
        int result = result * 59 + ($num == null ? 43 : $num.hashCode());
        Object $jobName = this.getJobName();
        result = result * 59 + ($jobName == null ? 43 : $jobName.hashCode());
        return result;
    }

Après avoir compris cela, j'ai changé @Data en @ToString, @Setter, @Getter, et le problème a été résolu.

@Setter
@Getter
@ToString
public class Person implements Cloneable{
    private Integer num;
    private String jobName;

    @Override
    public Person clone() throws CloneNotSupportedException {
        return (Person)super.clone();
    }
}

Je suppose que tu aimes

Origine blog.csdn.net/weixin_47025878/article/details/129101631
conseillé
Classement