[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() 是至关重要的。

浙公网安备 33010602011771号