Java 重复插入时的映射抛出错误

Java 重复插入时的映射抛出错误,java,dictionary,Java,Dictionary,我正在创建一个包含一些数据的映射,如果试图插入重复值,我希望映射引发异常 Map <Integer, String> temp; temp.put(1, "hi"); temp.put(1, "hello"); Map温度; 温度输入(1,“高”); 临时放置(1,“你好”); 由于键“1”已存在,因此此映射应引发错误。 它可能抛出错误或不编译。 是否有任何地图显示了上述功能 Map.put返回与键关联的上一个值,如果存在,则返回null 没有键的映射。(null返回也可以表示映

我正在创建一个包含一些数据的映射,如果试图插入重复值,我希望映射引发异常

Map <Integer, String> temp;
temp.put(1, "hi");
temp.put(1, "hello");
Map温度;
温度输入(1,“高”);
临时放置(1,“你好”);
由于键“1”已存在,因此此映射应引发错误。 它可能抛出错误或不编译。 是否有任何地图显示了上述功能

Map.put返回与键关联的上一个值,如果存在,则返回null 没有键的映射。(null返回也可以表示映射 如果实现支持,则以前将null与键关联 空值。)

所以你可以这样做:

public void addItem ( Integer key, String value ) throws Exception {
  String old = map.put( key, value );
  if ( old != null) {
     throw new Exception("Already exists!");
  }
}

注意:在这段代码中,无论如何都会插入新值,即使键已经存在,也不能添加null,因为它会引发异常。

Map在尝试使用映射中存在的键添加新值时不会引发任何错误或异常。在这种情况下,旧值只是被新值替换

如果您想添加在这种情况下会引发错误的功能,可以使用

if(map.containsKey(yourKey)) // here your error action

检查containsKey方法

Map<Integer, String> map = new LinkedHashMap<>();

    map.put(1, "Value");
    if (map.containsKey(1)) {
        throw new Exception("Map already contains key 1");
    }
然后使用它:

public static void main(String[] args) throws Exception {

        Map<Integer, String> map = new MyCustomMap();

        map.put(1, "Value");

        map.put(1, "Another value");

    }
publicstaticvoidmain(字符串[]args)引发异常{
Map Map=新的MyCustomMap();
地图放置(1,“值”);
map.put(1,“另一个值”);
}
注意:这是一个示例,没有空检查等


但是,请在询问之前,始终尝试检查JavaDoc或基本数据结构用例,我相信Google上有大量的示例;)

在put操作之前使用包含检查不是原子操作,因此不是线程安全的。此外,每次添加条目时,必须访问地图两次

要避免这种情况,请使用诸如merge或compute之类的函数方法之一:

map.merge(key, value, (v1, v2) -> {
    throw new IllegalArgumentException("Duplicate key '" + key + "'.");
});

上面的代码将始终抛出NullPointerException,因为您甚至没有初始化临时映射。重复与否。映射不需要有这样的功能,因为您可以随时调用
if(temp.containsKey(1))
以避免出现这样的异常。@Stultuske我知道我没有初始化映射,因为我不知道使用哪个实现来实现它。它可以是HashMap()或ImmutableMap或任何其他。
Map
接口定义了
put
的替换行为-因此任何执行不同操作的实现都将违反该约定。此外,为了防止必须检查应用程序中的重复值帐户,我建议扩展HashMap类并重写put方法以检查是否存在重复,然后只检查insertwe。当外部库使用该映射时,我们只能使用第二种解决方案。但问题是它也会默默地失败。或者,我们可以抛出RuntimeException。
map.merge(key, value, (v1, v2) -> {
    throw new IllegalArgumentException("Duplicate key '" + key + "'.");
});