Java集合(二)—散列与散列码

Java集合(二)—散列与散列码

  Object的hashCode()方法生成散列码,它默认使用的是对象的地址计算散列码。因此在使用散列的数据结构(HashSet,HashMap,LinkedHashMap和LikedHashSet),必须为你的键(自己编写的类)覆盖hashCode()和equals()方法(因为equals()方法也是Object的一部分)

  默认的 Object.equals()只是比较对象的地址,若要使用自己的类作为HashMap的键必须重载hashCode()和equals()方法。

一:equals()方法必须满足的条件

  1. 自反性:对任意 x,x.equals(x)一定返回true。
  2. 对称性:对任意x 和y,如果y.equals(x)返回true,则x.equals(y)也返回true。
  3. 传递性:对任意x,y,z,如果有x.equals(y)返回ture,y.equals(z)返回true,则x.equals(z)一定返回true。
  4. 一致性:对任意 x 和y,如果对象中用于等价比较的信息没有改变,那么无论调用x.equals(y)多少次,返回的结果应该保持一致,要么一直是true,要么一直是false。
  5. 对任何不是 null 的x,x.equals(null)一定返回false。

二:理解hashCode()

使用散列的目的在于:想要使用一个对象来查找另一个对象。

三:覆盖hashCode()

设计hashCode最重要的因素就是:无论何时,对同一个对象调用hashCode()都应该生成同样的值。
以String为例:

public class TestStringhashCode {
    public static void main(String [] args){

        String []hellos = "hello hello".split(" ");
        System.out.println( hellos[0].hashCode());
        System.out.println(hellos[1].hashCode());

        String a = new String("hello");
        System.out.println(a.hashCode());
        String b = new String("hello");
        System.out.println(b.hashCode());
    }
}

String类中有多个String对象,都包含相同的字符串序列,那么这些String对象都映射到同一块内存区域。所以new String("hello")生成的几个实例虽然是相互独立的,但是对他们使用hashCode应该生成相同的结果。
对于String而言,hashCode()是基于String内容生成的。

转载于:https://www.cnblogs.com/0427mybirthday/p/7668904.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值