当前位置: 首页 > 面试题库 >

为什么不允许外部接口为HashMap提供hashCode /等于?

宋昊然
2023-03-14
问题内容

使用a
TreeMap提供一个custom很简单Comparator,从而覆盖了Comparable添加到地图的对象所提供的语义。HashMap但是不能以这种方式控制;提供哈希值和相等性检查的函数不能“侧加载”。

我怀疑设计一个接口并将其改造成HashMap(或一个新类)既简单又有用?像这样的东西,除了名字更好:

  interface Hasharator<T> {
    int alternativeHashCode(T t);
    boolean alternativeEquals(T t1, T t2);
  }

  class HasharatorMap<K, V> {
    HasharatorMap(Hasharator<? super K> hasharator) { ... }
  }

  class HasharatorSet<T> {
    HasharatorSet(Hasharator<? super T> hasharator) { ... }
  }

在不区分大小写Map的问题得到了平凡解:

 new HasharatorMap(String.CASE_INSENSITIVE_EQUALITY);

这是可行的,还是您会看到这种方法的任何基本问题?

现有(非JRE)库中是否使用了这种方法?(尝试过Google,没有运气。)

编辑:由hazzen提出的很好的解决方法,但是我担心这是我要避免的解决方法…;)

编辑:更改标题以不再提及“比较器”;我怀疑这有点令人困惑。

编辑:关于性能的公认答案;希望有一个更具体的答案!

编辑:有一个实现;请参阅下面接受的答案。

编辑:改写第一句话,以更清楚地表明这是我所关注的侧装(而不是订购;订购不属于HashMap)。


问题答案:

Trove4j具有我所追求的功能,他们称其为哈希策略。

他们的地图的实现具有不同的局限性,因此前提条件也不同,因此,这并不意味着Java的“本地” HashMap实现是可行的。



 类似资料:
  • 为了防止实现细节泄漏,可以实现,而不是返回,然后需要从接口实现。因此,无论内部数据结构如何管理,对元素的访问都是通过进行的。 对于Java8,可能希望将添加到。(另请参阅《Java8lambdas》一书中关于支持的建议)。虽然添加方法并不困难(我也读过关于为什么Iterable不提供流的问题),但奇怪的是Java没有为添加接口来镜像思想。(好吧,可能有一个不同的名称,因为是为了永远使用CORBA的

  • 这是一个关于data.table连接语法的哲学问题。我发现越来越多的数据.表的用途,但仍在学习... data.tables的联接格式非常简洁、方便和高效,但据我所知,它只支持内部联接和右外部联接。要获得左或完全的外部联接,我需要使用: --Y中的所有行--右外部联接(默认) --仅限在X和Y中都匹配的行--内部联接 --来自X和Y的所有行--完全外部联接 --X中的所有行--左外部联接 在我看来

  • 问题内容: Java 8最有用的功能之一是接口上的新方法。引入它们的原因基本上有两个(可能还有其他原因): 提供实际的默认实现。例: 允许JDK API演进。例: 从API设计人员的角度来看,我希望能够在接口方法上使用其他修饰符,例如。在添加便捷方法时,这将很有用,以防止在实现类时“意外”覆盖: 如果已经上过课,以上是已经很普遍的做法: 现在,并且显然是相互矛盾的关键字,但是默认关键字本身并没有严

  • 为什么Java不允许在接口中使用私有成员?有什么特别的原因吗?

  • 虽然有些人曾经问过这个问题,但那是在Java8发布之前。 以前,静态成员是不允许的,因为实现细节不能在接口中定义。这也是为什么任何东西都不应该是私有的,因为接口的实现者需要提供实现细节。 Java8改变了这种情况,不是吗?默认方法定义实现细节,静态方法也是如此。那么,为什么仍然不允许这样做呢?

  • 这个问题看起来像是重复的,但实际上不是。只是一个不断重复的微小差异。git一直告诉我:“请告诉我你是谁”,即使在设置之后。当我运行时,这就是我得到的…… 但是当我运行时,它会给我所有的详细信息… 我已经更改了我的姓名、电子邮件和代理,但当我运行命令时,它们看起来很好,即使在.gitconfig文件中,我也可以看到设置的值。可能缺少什么,因为我根本无法promise。每次它总是问我是谁? @sheu