hashcode方法?是什么?

hashcode方法?是什么?

引用资源:https://www.jianshu.com/p/417a192125f6

概念:

Java的Object类中有一个hashCode()方法,并且是本地方法,返回一个int类型数值

对于包含容器类型的程序设计语言来说,基本上都会涉及到hashCode。在Java中也一样,hashCode方法的主要作用是为了配合基于散列的集合一起正常运行,这样的散列集合包括HashSet、HashMap以及HashTable。

分析:

举个列子:当向集合中插入对象时,如何判别在集合中是否已经存在该对象?(集合中不允许重复的元素存在)

大多数人会想到equals方法来逐个进行比较,这个方法确实可行。但是如果集合中已经存在一万条数据或者更多的数据,效率必然是一个问题。所以,hashCode作用就体现出来了,当集合要添加新的对象时,先调用这个对象的hashCode方法,得到相应的hashCode值,实际上HashMap的具体实现中会用一个table保存已经存进去的对象的hashCode值,如果table中没有这个hashCode值,就可以直接存进去,不用再进行任何比较了;如果存在该hashCode值,就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其他的地址,所以这里存在一个冲突解决的问题,这样一来实际调用equals方法的次数就大大降低了,通俗来说,Java中的hashCode方法就是根据一定规则将与对象相关的信息(比如对象的存储地址,对象的字段等)映射成一个数值,这个数值称作为散列值。

实例:

DataString dataString1 = new DataString("woshi",20);
DataString dataString2 = new DataString("woshi",20);

System.out.println(dataString1.hashCode());
System.out.println(dataString2.hashCode());
输出:
460141958
1163157884

第一个例子:

其实很容易知道,两个不同的对象,散列值一般是不同的,记住,这里说的是一般不同!为什么?因为两个不同的对象是可能生成同一个散列值的!
也就是说我们不能通过hashcode来判断两个对象相等,但是却可以判断两个对象不等。

也就是如果两个对象散列值相等,那么也不一定是同一个对象,但是如果散列值不同,那么一定是两个不同的对象!

  String strx = "OK";
    StringBuffer str2 = new StringBuffer(strx);
    String str3 = new String(strx);
    StringBuilder str4 = new StringBuilder(strx);
    System.out.println(strx.hashCode());
    System.out.println(str2.hashCode());
    System.out.println(str3.hashCode());
    System.out.println(str4.hashCode());
    输出:
    2524
    1956725890
    2524
    356573597

第二个例子:

大家肯定有疑问,为什么strx和str3的散列值是一样的!而str2,str4不一样,这就涉及到String中对hashcode的方法进行了改写,String类里的hashcode是根据字符串内容进行生成的,也就是内容相同,那么散列值就相同。

而StringBuffer则是调用的Object方法中的hashcode,所以自然hashcode不同了!至于为什么String改写了equals方法还要改写hashcode方法,还没有学习到,我的下一篇博客中应该会写这个!https://blog.csdn.net/weixin_44844089/article/details/103681519

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: HashCode方法是Object类中的一个方法,用于返回对象的哈希码值,它是一个int类型的整数。哈希码值是根据对象的内部信息计算出来的,可以用于快速地比较两个对象是否相等。在Java中,哈希码值经常被用于哈希表、集合等数据结构中。 ### 回答2: HashCode方法Java中Object类中的一个方法,用于返回对象的哈希码。哈希码是由对象的内部状态通过哈希算法转换而来的一个唯一标识。在Java中,哈希码经常被用于数据结构中,如HashMap、HashSet等。 HashCode方法的定义在Object类中,因此所有的Java对象都可以调用该方法。一般情况下,Object类的HashCode方法返回对象的内存地址的一个整数表示。但是,根据对象的不同,也可以自己重写HashCode方法以实现特定的哈希码生成逻辑。 HashCode方法具有以下特点: 1. 对于同一个对象,在程序的多次执行中,其HashCode值保持不变。 2. 如果两个对象通过equals方法相等,那么它们的HashCode值必须相同。但是,HashCode相等的对象不一定通过equals方法相等。 3. HashCode方法的性能要求比较高,因为在使用哈希表等数据结构时,需要频繁地计算对象的HashCode值。 重写HashCode方法时,需要遵循以下规范: 1. 如果equals方法返回true,那么HashCode方法必须返回相同的哈希码。 2. 对于不相等的对象,HashCode方法应返回尽可能不同的哈希码,以提高哈希表等数据结构的性能。 为了方便使用哈希表等数据结构,许多Java类如String、Integer等都已经重写了HashCode方法。对于自定义的类,如果需要使用哈希表等数据结构,可以根据对象的内部状态来生成哈希码,以满足不同对象的区分和快速访问的需求。 ### 回答3: HashCode方法Java中的一种方法,用于将一个对象的内存地址经过算法计算后转化为一个整型数值。HashCode方法通常在数据结构中用于快速查找和比较对象。 在Java中,每个对象都有一个默认的HashCode方法。默认的HashCode方法会根据对象的内存地址生成一个唯一的整型数值。这意味着,不同的对象肯定会有不同的HashCodeHashCode方法在集合类中被广泛使用,例如在HashTable、HashMap、HashSet等类中。这些类根据对象的HashCode值来进行快速的查找和比较操作。在这些集合类中,对象的HashCode值被用于确定对象在集合中的位置或者用于判断两个对象是否相等。 为了正确使用HashCode方法,需要满足一些规则: 1. 如果两个对象通过equals方法相等,那么它们的HashCode值必须相等。 2. 如果两个对象的HashCode值相等,它们不一定通过equals方法相等,这是因为HashCode方法的计算过程有可能发生冲突。 3. 对象的HashCode值在同一程序的多次执行中可能会发生变化,所以HashCode值不能被作为对象的唯一标识。 通常情况下,当我们需要在自定义类中使用HashCode方法时,需要重写该方法。重写HashCode方法的目的是为了保证对象的相等性和性能。在重写HashCode方法时,一般会根据对象的属性进行计算,以尽量保证不同的对象拥有不同的HashCode值。同时,需要保证如果两个对象的属性相等,它们的HashCode值也相等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值