首先,我想说明我知道java.lang.Object.hashCode()
的javadoc,因此无需再次提及。
我要问的是:为什么java.lang.Object.hashCode()
没有移入名为(可能)Hashable
的单独界面?像`java.lang.Comparator'?
对我来说,hashCode()
仅用于与HashMap
或HashTable
相关的哈希相关数据结构,其中a)未在每个应用程序中使用b)通常只使用极少数类似于String
或Integer
的密钥类型,而不是InputStream
(或类似内容)。
我知道我不必为我的每个类实现hashCode()
,但是,在一定程度上是否以性能为代价向类中添加方法?特别是对于java.lang.Object
- Java中每个类的超类。
即使在JVM中进行了特殊优化以便可以忽略性能损失,我仍然认为为每个Object
提供一个根本不经常实现的行为是不明智的。根据{{3}}:
不应该强迫任何客户依赖它不使用的方法。
我在网上进行了一些搜索,我找到的唯一相关页面是Interface Segregation Principle。
第一个答案表达了(部分)与我同样的想法,其他一些人试图回答这个问题,主要是说hashCode()
每个Object
能够在{HashMap
中存储任何类型的对象{1}}“,我认为这并不令人满意。
我在此提出我自己的解决方案,它既满足了接口隔离原则,又能够在HashMap
中存储任何内容,而不会给整个系统增加太多复杂性:
hashCode()
移除java.lang.Object
。Hashable
接口,其中hashCode()
与前者java.lang.Object.hashCode()
的合同相同。HashProvider
的类型参数T
包含provideHashCode(T t)
,以提供对象的哈希码。 (想想Comparator<T>
)。HashProvider<Object>
DefaultHashProvider
实现Object
,使用Object.hashCode()
的当前实现生成任何DefaultHashProvider.provideHashCode()
的哈希码。 (对于Java 8,Object.hashCode()是一种本机方法,我希望Object
为任何HashMap
返回相同的内容。HashTable
和provideHashCode()
的构造函数,以便通过以下方式将所有内容存储在其中:
HashProvider
,则使用hashCode()
。Hashable
的基础元素实现DefaultHashProvider
。Comparable
Comparator
。我认为这在实践中是可行的,因为它只是TreeMap
,Comparator
和Comparable
系统的变体。
让我重复我的问题:
考虑到Java开发团队不应该无法提出类似于我的解决方案,有没有充分的理由不这样做?我目前还没有意识到一些高级考虑因素吗?我有以下假设,他们中的任何一个都接近正确的答案吗?
TreeMap
,HashMap
和hashCode()
一起存在,用于编写它们的技术不能适应Object
吗?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。