5

如果已经存在,如何防止 hashmap 或 treemap 替换先前的键值?另外,我想抛出异常以通知用户。

4

5 回答 5

11

Map老实说,任何这样的地图都会违反正常界面。但是,如果您愿意这样做,您可以轻松地创建自己的Map实现,该实现委托给另一个地图,但前提是检查是否存在现有元素:

public final class NonReplacementMap<K, V> implements Map<K, V> {
    private final Map<K, V> original;

    public NonReplacementMap(Map<K, V> original) {
        this.original = original;
    }

    @Override
    public void put(K key, V value) {
        if (original.containsKey(key)) {
            // Or whatever unchecked exception you want
            throw new IllegalStateException("Key already in map");
        }
        original.put(key, value);
    }

    // etc
}
于 2013-09-07T08:14:19.033 回答
7

使用 myMap.putIfAbsent(key, val)

从 1.8 开始,这已在 Map 界面中引入

     * @since 1.8
     */
     default V putIfAbsent(K key, V value) {
于 2016-12-14T22:21:11.737 回答
3

为什么不直接包装你的地图?组合优于继承

void put(Object key, Object value){
    if(map.containsKey(key)){
     throw Exception("Custom exception");
    }else{
    map.put(key,value);
    }
}
于 2013-09-07T08:16:04.667 回答
2

您可以使用Map#containsKey(object)方法检查密钥是否已经存在,然后再将其添加到Map

于 2013-09-07T08:17:17.153 回答
0

不,默认情况下你不能,因为它似乎对你有特定的要求。

所以创建你自己的类来扩展HashMap/任何实现和 ovveride 插入方法。

如果 key 与return来自 there/ throwsome的现有 key 匹配exception

于 2013-09-07T08:14:36.947 回答