AbstractMap.SimpleEntry如何可变?

Suz*_*ioc 2 java collections hashmap

怎么可以AbstractMap.SimpleEntry同时

1)mutable(它的方法setValue()改变条目的值部分)

2)具有equals()/ hashCode()定义包括条目的值部分

3)成为Set<Map.Entry<T,K>> entrySet()结果的一部分

在我看来,这三点是有争议的.例如,前两个违反了Set<>接口契约,这不建议拥有该集合的可变元素.

我可以肯定,变异Value不会破坏地图吗?

为什么他们没有Entry只用钥匙进行比较和清洗呢?这会在某些情况下提高速度吗?

das*_*ght 5

我敢肯定,Value的变异不会破坏地图吗?

是的,一点没错.该HashMap桶只考虑了项目的关键部分:

public V  [More ...] put(K key, V value) {
    if (key == null)
        return putForNullKey(value);
    int hash = hash(key.hashCode()); // <<== HERE
    ...
}
Run Code Online (Sandbox Code Playgroud)

为什么他们没有进入可比较和可按键的可用?这会在某些情况下提高速度吗?

hashCodeequalsMap.Entry很少有相关性:只有当你想凑条目,他们将被用于外面HashMap本身.在内部实现EntrySet供给的呼叫者Map.entrySet不使用hashCode/ equals入门-相反,他们只使用了关键部分的哈希码.以下是在条目集中查找对象的相关源代码的一部分:

 public boolean contains(Object o) {
     if (!(o instanceof Map.Entry))
         return false;
     Map.Entry<K,V> e = (Map.Entry<K,V>) o;
     Entry<K,V> candidate = getEntry(e.getKey());
     return candidate != null && candidate.equals(e);
 }
Run Code Online (Sandbox Code Playgroud)