[Java基础]Hashcode
默认情况下hashcode是根据对象的地址计算的,但是请注意,对象的地址在GC的时候会发生变化,但是hashcode不能因为地址的变化而发生变化,所以要缓存hash值
另外,如果重写了hashcode方法,根据对象的属性值计算hashcode,那么每次修改对象的属性后都需要重新计算hashcode,并且缓存下来,增加了开销。(String就没有这种烦恼,因为string不可变性,hashcode只需要计算一次就可以了)
重写了Hashcode()方法的类
在Java中,许多类重写了 hashCode()
方法,以确保对象在集合(如 HashMap
、HashSet
等)中能够正确使用哈希机制。以下是一些常见的重写了 hashCode()
方法的类:
-
java.lang.Object
Java中的所有类都继承自Object
,而Object
类本身提供了hashCode()
的默认实现。默认实现是基于对象的内存地址计算哈希码。 -
java.lang.String
String
类重写了hashCode()
,并且它的实现会基于字符串的内容计算哈希码,而不是默认的内存地址。因此两个内容相同的字符串即使是不同的实例,其hashCode()
也是相同的。 -
java.lang.Integer
、java.lang.Long
、java.lang.Boolean
等包装类
Java中的基本类型包装类(如Integer
、Long
、Boolean
等)也都重写了hashCode()
方法,使得它们的哈希值与它们所包装的基本类型的值相关。 -
java.util.Date
和java.time.LocalDate
Date
和LocalDate
类重写了hashCode()
方法,使其基于日期和时间的值来计算哈希值。 -
java.util.HashMap
和java.util.HashSet
HashMap
和HashSet
都使用hashCode()
来进行键的存储和检索,因此这些类的元素必须重写hashCode()
方法以确保在这些集合中正确工作。 -
java.util.List
和java.util.Set
(如ArrayList
,LinkedList
,HashSet
,TreeSet
等)
这些集合类也重写了hashCode()
,它们的实现是基于集合中所有元素的hashCode()
进行计算的。 -
java.util.Objects
Objects
类提供了静态的hashCode()
方法,通常用于计算组合对象的哈希值。这些方法允许多个字段组合在一起生成一个哈希码。 -
java.util.Map.Entry
Map.Entry
类重写了hashCode()
,以便基于键值对的哈希值进行计算。 -
java.lang.Enum
所有枚举类都继承自Enum
,而Enum
重写了hashCode()
方法,它基于枚举常量的顺序值来计算哈希码。
总之,凡是需要比较对象内容而不是引用的类,一般都会重写 hashCode()
和 equals()
方法。对于那些在集合框架(如 HashSet
、HashMap
等)中作为键使用的类来说,重写 hashCode()
是至关重要的。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器