关于 hashset 的去重

韭菜盒子123 2021-10-15 08:41:29

我定义一个继承关系的类

class Pokemon {

    private String name;
    private int level;
    private int dVS;

    public Pokemon() {
    }

    public Pokemon(String name, int level, int dVS) {
        this.name = name;
        this.level = level;
        this.dVS = dVS;
    }
    

    @Override
    public boolean equals(Object o) {
       ...
    }

    @Override
    public int hashCode() {
        ...
    }
}

class PokemonPearl extends Pokemon{

    public PokemonPearl(String name, int level, int dVS) {
        super(name, level, dVS);
    }
}

class PokemonDiamond extends Pokemon{

    public PokemonDiamond(String name, int level, int dVS) {
        super(name, level, dVS);
    }
}

按照默认重写了 equals() 和 hashCode() 方法,这时候定义子父类的对象,加入到 hashset 里

        Pokemon p4 = new Pokemon("Ralts", 5, 31);
        PokemonPearl p5 = new PokemonPearl("Ralts", 5, 31);
        PokemonDiamond p6 = new PokemonDiamond("Ralts", 5, 31);

        java.util.HashSet<Pokemon> hs = new java.util.HashSet<Pokemon>();

        hs.add(p4);
        hs.add(p5);
        hs.add(p6);

为什么输出不会去重呢,按照逻辑,他们的 哈希值和内容都是相同的啊

...全文
188 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
韭菜盒子123 2021-10-15
  • 打赏
  • 举报
回复

啊,我知道了,那个equals 默认生成的时候,第一页的第一个勾没勾上

韭菜盒子123 2021-10-15
  • 打赏
  • 举报
回复

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Pokemon pokemon = (Pokemon) o;
        return level == pokemon.level &&
                dVS == pokemon.dVS &&
                Objects.equals(name, pokemon.name);
    }

    @Override
    public int hashCode() {

        return Objects.hash(name, level, dVS);
    }

脑子坏掉了,我是直接用的默认重写的

nayi_224 2021-10-15
  • 打赏
  • 举报
回复

你都知道equals和hashCode方法很重要还故意只发了三个点出来?

编号灬9527 2021-10-15
  • 打赏
  • 举报
回复

想得很美好,事实却不是是吧,hashset内部用hashmap实现这个没问题吧,map的key就是你add的元素,hashmap在判断同一个的key的时候,首先hash值相同,然后还有key是不是相同,你重写equals就去重了;

img

51,408

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧