如何防止HashMap或TreeMap在已经存在键值对的情况下替换先前的键值对?同时,我想抛出一个异常来通知用户。
如何防止HashMap或TreeMap在已经存在键值对的情况下替换先前的键值对?同时,我想抛出一个异常来通知用户。
说实话,任何这样的地图都将违反正常 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
}
使用myMap.putIfAbsent(key, val)
这个方法自1.8版本开始在Map接口中引入。
* @since 1.8
*/
default V putIfAbsent(K key, V value) {
void put(Object key, Object value){
if(map.containsKey(key)){
throw Exception("Custom exception");
}else{
map.put(key,value);
}
}
默认情况下,您不能这样做,因为它似乎是您的特定要求。
因此,请创建自己的类,该类扩展HashMap
/任何实现,并覆盖插入方法。
如果键与现有键匹配,则从那里返回
/抛出
一些异常
。
如果映射表先前包含了该键的映射,则旧值将被指定的值替换。
- yshavit