如何防止HashMap或TreeMap替换先前的值

5

如何防止HashMap或TreeMap在已经存在键值对的情况下替换先前的键值对?同时,我想抛出一个异常来通知用户。

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
}

1
请问这是如何违反了Map接口的? - beinghuman
2
就在文档中写着:如果映射表先前包含了该键的映射,则旧值将被指定的值替换。 - yshavit

7

使用myMap.putIfAbsent(key, val)

这个方法自1.8版本开始在Map接口中引入。

     * @since 1.8
     */
     default V putIfAbsent(K key, V value) {

3
为什么不直接使用Map呢?参见组合优于继承
void put(Object key, Object value){
    if(map.containsKey(key)){
     throw Exception("Custom exception");
    }else{
    map.put(key,value);
    }
}

2

0

默认情况下,您不能这样做,因为它似乎是您的特定要求。

因此,请创建自己的类,该类扩展HashMap/任何实现,并覆盖插入方法。

如果键与现有键匹配,则从那里返回/抛出一些异常


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接