繁体   English   中英

如何将Collections.synchronizedMap(new HashMap())转换为Hash Map

[英]How to convert Collections.synchronizedMap(new HashMap()) to Hash Map

我们有一个返回HashMap的接口。

现在由于线程安全,我们已经使用

Collections.synchronizedMap(new HashMap());

现在,使用我们的Interface面对类的客户端强制抛出异常,因为

Collections.synchronizedMap返回一个同步映射,并且不能将其强制转换为哈希映射

我们必须将此syncedMap转换回哈希图

有没有办法转换由...返回的syncedMap

将Collections.synchronizedMap()返回到哈希图。

如果复制是可接受的(也就是说,您不需要对同步映射进行后续写入就可以反映在返回的映射中),则只需使用采用Map输入的 HashMap 构造函数 确保首先在syncedMap上进行同步,因为副本需要在地图上进行迭代(无论如何都必须进行同步)。

synchronized (map) {
  return new HashMap<>(map);
}

同步块不是真正可选的。 文档

当迭代任何集合视图时,用户必须手动在返回的地图上进行同步

并不完美,但也许可以在您的情况下使用:创建一个扩展HashMap的类,但该类在内部具有同步的Map。 然后,将所有方法调用委托给您的内部映射。 在构造函数上,创建一个新的HashMap,然后对其进行同步。 像这样:

public class SynchronizedHashMap<K, V> extends HashMap<K, V> {
    private Map<K, V> internalMap;

    public SynchronizedHashMap(int initialCapacity, float loadFactor) {
        internalMap = Collections.synchronizedMap(new HashMap<>(initialCapacity, loadFactor));
    }

    public SynchronizedHashMap(int initialCapacity) {
        internalMap = Collections.synchronizedMap(new HashMap<>(initialCapacity));
    }

    public SynchronizedHashMap() {
        internalMap = Collections.synchronizedMap(new HashMap<>());
    }

    public SynchronizedHashMap(Map<? extends K, ? extends V> m) {
        internalMap = Collections.synchronizedMap(new HashMap<>(m));
    }

    @Override public int size() {
        return internalMap.size();
    }

    @Override public boolean isEmpty() {
        return internalMap.isEmpty();
    }

    @Override public boolean containsKey(Object o) {
        return internalMap.containsKey(o);
    }
    ...
}

请记住,这就是为什么您应该为接口编码,而不是为具体实现编码。 您的界面应该返回一个Map,而您的客户端应该使用一个Map,而不必知道它是哪个 Map。

可以吗:

        Map hashMap = new HashMap();
        Map syncMap = Collections.synchronizedMap(hashMap);
        HashMap m = new HashMap(syncMap);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM