Loading

[Java基础]Hashcode

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

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

重写了Hashcode()方法的类

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

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

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

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

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

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

  6. java.util.List 和 java.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() 方法。对于那些在集合框架(如 HashSet、HashMap 等)中作为键使用的类来说,重写 hashCode() 是至关重要的。

posted @ 2024-07-30 17:24  Duancf  阅读(87)  评论(0)    收藏  举报