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

时间:2017-10-30 13:09:42

标签: java hash hashcode

首先,我想说明我知道java.lang.Object.hashCode()的javadoc,因此无需再次提及。

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

对我来说,hashCode()仅用于与HashMapHashTable相关的哈希相关数据结构,其中a)未在每个应用程序中使用b)通常只使用极少数类似于StringInteger的密钥类型,而不是InputStream(或类似内容)。

我知道我不必为我的每个类实现hashCode(),但是,在一定程度上是否以性能为代价向类中添加方法?特别是对于java.lang.Object - Java中每个类的超类。

即使在JVM中进行了特殊优化以便可以忽略性能损失,我仍然认为为每个Object提供一个根本不经常实现的行为是不明智的。根据{{​​3}}:

  

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

我在网上进行了一些搜索,我找到的唯一相关页面是Interface Segregation Principle

第一个答案表达了(部分)与我同样的想法,其他一些人试图回答这个问题,主要是说hashCode()每个Object能够在{HashMap中存储任何类型的对象{1}}“,我认为这并不令人满意。

我在此提出我自己的解决方案,它既满足了接口隔离原则,又能够在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()的当前实现生成任何DefaultHashProvider.provideHashCode()的哈希码。 (对于Java 8,Object.hashCode()是一种本机方法,我希望Object为任何HashMap返回相同的内容。
  5. 修改HashTableprovideHashCode()的构造函数,以便通过以下方式将所有内容存储在其中:
    1. 如果指定了HashProvider,则使用hashCode()
    2. 如果Hashable的基础元素实现DefaultHashProvider
    3. ,则使用Comparable
    4. 否则使用Comparator
  6. 我认为这在实践中是可行的,因为它只是TreeMapComparatorComparable系统的变体。

    让我重复我的问题

    考虑到Java开发团队不应该无法提出类似于我的解决方案,有没有充分的理由不这样做?我目前还没有意识到一些高级考虑因素吗?我有以下假设,他们中的任何一个都接近正确的答案吗?

    1. 此解决方案所需的某些语言功能(如泛型类型)仅在Java开头之后才可用 - 从1.5开始。但是,我认为自{1.2}以来TreeMapHashMaphashCode()一起存在,用于编写它们的技术不能适应Object吗?
    2. DefaultHashProvider.provideHashCode()在JVM中的某个地方使用,因此它要求每个def gen(count): for i in range(count): yield i+1 my_list = ['mpla', 'future_use','mpla','future_use','future_use','mpla'] count = my_list.count("future_use") idx = gen(count) for i in range(count): my_list = [item if item!='future_use' else 'future_use' + str(next(idx)) for item in my_list] print(my_list) 都有一个哈希码。但是,使用{{1}}(或其原生实现)也可以使用非forhables。

0 个答案:

没有答案