[Java基础]Hashcode

默认情况下hashcode是根据对象的地址计算的,但是请注意,对象的地址在GC的时候会发生变化,但是hashcode不能因为地址的变化而发生变化,所以要缓存hash值

另外,如果重写了hashcode方法,根据对象的属性值计算hashcode,那么每次修改对象的属性后都需要重新计算hashcode,并且缓存下来,增加了开销。(String就没有这种烦恼,因为string不可变性,hashcode只需要计算一次就可以了)

重写了Hashcode()方法的类

在Java中,许多类重写了 hashCode() 方法,以确保对象在集合(如 HashMapHashSet 等)中能够正确使用哈希机制。以下是一些常见的重写了 hashCode() 方法的类:

  1. java.lang.Object
    Java中的所有类都继承自 Object,而 Object 类本身提供了 hashCode() 的默认实现。默认实现是基于对象的内存地址计算哈希码。

  2. java.lang.String
    String 类重写了 hashCode(),并且它的实现会基于字符串的内容计算哈希码,而不是默认的内存地址。因此两个内容相同的字符串即使是不同的实例,其 hashCode() 也是相同的。

  3. java.lang.Integerjava.lang.Longjava.lang.Boolean 等包装类
    Java中的基本类型包装类(如 IntegerLongBoolean 等)也都重写了 hashCode() 方法,使得它们的哈希值与它们所包装的基本类型的值相关。

  4. java.util.Datejava.time.LocalDate
    DateLocalDate 类重写了 hashCode() 方法,使其基于日期和时间的值来计算哈希值。

  5. java.util.HashMapjava.util.HashSet
    HashMapHashSet 都使用 hashCode() 来进行键的存储和检索,因此这些类的元素必须重写 hashCode() 方法以确保在这些集合中正确工作。

  6. java.util.Listjava.util.Set(如 ArrayList, LinkedList, HashSet, TreeSet 等)
    这些集合类也重写了 hashCode(),它们的实现是基于集合中所有元素的 hashCode() 进行计算的。

  7. java.util.Objects
    Objects 类提供了静态的 hashCode() 方法,通常用于计算组合对象的哈希值。这些方法允许多个字段组合在一起生成一个哈希码。

  8. java.util.Map.Entry
    Map.Entry 类重写了 hashCode(),以便基于键值对的哈希值进行计算。

  9. java.lang.Enum
    所有枚举类都继承自 Enum,而 Enum 重写了 hashCode() 方法,它基于枚举常量的顺序值来计算哈希码。

总之,凡是需要比较对象内容而不是引用的类,一般都会重写 hashCode()equals() 方法。对于那些在集合框架(如 HashSetHashMap 等)中作为键使用的类来说,重写 hashCode() 是至关重要的。

作者:Esofar

出处:https://www.cnblogs.com/DCFV/p/18332977

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   Duancf  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器
more_horiz
keyboard_arrow_up light_mode palette
选择主题
点击右上角即可分享
微信分享提示