小编std*_*453的帖子

java - 为什么hashCode()在Object而不是单独的接口?

首先,我想说明我已经知道了javadoc,java.lang.Object.hashCode()因此没有必要再次提及它.

我要问的是:为什么不java.lang.Object.hashCode()进入一个名为(可能)的单独界面Hashable?像`java.lang.Comparator'?

对我来说,hashCode()仅用于与哈希相关的数据结构中,HashMap或者HashTablea)a)未在每个应用程序中使用b)通常与极少数类型的键一起使用,例如StringInteger不与InputStream(或类似的东西).

我知道我不需要hashCode()为我的每一个类实现,但是,在某种程度上不是以牺牲性能为代价向类添加方法?特别是对于java.lang.ObjectJava中每个类的超类.

即使在JVM中进行了特殊优化以便可以忽略性能损失,我仍然认为为每个人Object提供一个根本不经常实现的行为是不明智的.根据接口隔离原则:

不应该强迫任何客户端依赖它不使用的方法.

我在网上做了一些搜索,我能找到的唯一相关页面就是这个.

第一个答案表达(部分)与我的想法相同,其他一些人试图回答这个问题,主要是说" hashCode()每个人都Object可以存储任何类型的物体HashMap",我认为这并不令人满意.

我在这里提出了我自己的解决方案,它既满足了接口隔离原则,又能够在HashMap不增加整个系统复杂性的情况下存储任何内容:

  1. hashCode()从中移除java.lang.Object.
  2. 让一个接口Hashable,包含hashCode()与前者相同的合同java.lang.Object.hashCode().
  3. 让一个HashProvider带有类型参数的接口T包含provideHashCode(T t)为对象提供哈希码.(想想Comparator<T>).
  4. 让我们有一个HashProvider<Object>被调用的实现,DefaultHashProvider它为Object使用当前实现的任何一个生成哈希码Object.hashCode().(对于Java 8,Object.hashCode()是一个本机方法,我期望DefaultHashProvider.provideHashCode() …

java hash hashcode

5
推荐指数
0
解决办法
173
查看次数

标签 统计

hash ×1

hashcode ×1

java ×1