hash表如何确定元素的唯一性?

获取对象的hash值使用:

         对象名.hashCode()方法。

 当我们直接打印对象名时,我们说是打印的是对象的地址值。其实,Java中地址值实际上是假的,实际上是哈希值的16进制。

如果我们转换一下,发现对象的hashcode和对面打印出的“地址值”是一样的

在Java中,是有实际真实的地址值的,只不过调用tostring()方法,将他转换成哈希值的16进制返回了。

在object类中的tostring()方法:

getClass().getName() + '@' + Integer.toHexString(hashCode())

toHexString()就是返回16进制的方法。

 

比较哈希表元素唯一,要分为两步:

第一就是我们在类里的比较哈希值,第二是判断元素内容:equals()方法。

如果正常情况下,得到的hashCode不同,内容也不同,那么元素添加不会有重复的。因为set是无序不重复的。

但是,如果是不同的对象结果呢,例如我我新建一个自定义类User,类里只有姓名和密码。不重写其他方法。可以重写ToString().

HashSet<User> user=new HashSet<>();
user.add(new User("姓名1",密码1));
user.add(new User("姓名2",密码2));
user.add(new User("姓名1",密码1));

当匿名创建多个对象时,对象不同,那么肯定他的HashCode也不相同.对象没有重写,那么他比较的是地址值,结合上面说的,既然比较地址值,那么得出的equals也是不一样的。结果就出来了。

会出现添加了两个姓名1,密码1.

解决的方法就是我们用到的:

override:

      使用哈希表结构保存自定义类型时,为了保证元素的唯一性,

       必须重写自定义类型中的hashCode和equals方法 

通过重写,会先比较添加的内容,通过内容来判断hash值,

 @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Test test = (Test) o;
        return age == test.age &&
                name.equals(test.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

看下面的那个hashcode(),是通过姓名和年龄,也就姓名和密码来得出哈希值的,内容一样,得出的hashcode也是一样的,那么就不可以添加到set集合中!!

也就确定了集合中元素的唯一!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

慢慢CG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值