两个HashMaps“共享”相同的数据吗?

时间:2020-07-13 00:37:34

标签: java list hashmap key

我有一个问题,可能是因为我对HashMaps缺乏经验。基本上,我有一个包含两个HashMap变量的类:

private Map <String, List<String>> definiciones = new <String, List<String>> HashMap();
private Map <String, List<String>> sinonimos = new <String, List<String>> HashMap();

当我调用它们各自的函数时,它们将字符串存储在其列表中。问题是,例如,当我将一个字符串添加到definiciones Map中的List时,它也以某种方式出现在sinonimos中。

public void agregarDefinicionAPalabra(String palabra, String definicion) throws PalabraInvalida {
    System.out.println(definiciones.get(palabra).size());
    if(definicion.equals("")) {
        JOptionPane.showMessageDialog(null, "La definición no puede estar vacía");
        throw new PalabraInvalida("La definición no puede estar vacía");
    }

    if (definiciones.containsKey(palabra)) {
        definiciones.get(palabra).add(definicion);
    } else {
        throw new PalabraInvalida("No se ha encontrado la palabra solicitada");
    }
    System.out.println(sinonimos.get(palabra).get(0));
}

该方法将一个字符串添加到定义列表中,如您所见,最后,我打印了一个文字以确认我刚刚写的这个想法。确实,当我运行此方法时,sinonimos List会获得我添加的definiciones元素。 显然由于我对此主题的经验不足,我不知道有什么建议吗?

谢谢!

3 个答案:

答案 0 :(得分:2)

您可能将相同的列表对象放入两个HashMap中。在Java中,所有对象均由其内存地址引用。当您将列表放入HashMap时,它实际上只是存储列表的内存地址。

打个比方,如果我把我家的街道地址给两个朋友,他们俩都写下了我的地址,我不会突然得到两所房子。如果我的一个朋友在我家门口放了一个包裹,而另一个朋友走过,他们将看到包裹仍在那儿。

因此,请确保在创建列表的代码中,为两个地图创建了不同的单独列表。

答案 1 :(得分:1)

我认为您必须对Listdefiniciones映射中的值使用相同的sinonimos对象。例如,您必须执行以下操作:

String palabara = "example";
List<String> list = new ArrayList<>();
definiciones.set(palabra, list);
sinonimos.set(palabra, list);

这里发生的是,您现在具有与两个映射中的值相同的列表。因此,当您调用definiciones.get(palabra)sinonimos.get(palabra)时,这两个都将为您提供对内存中相同列表的引用。

您需要做的是:

String palabara = "example";
definiciones.set(palabra, new ArrayList<>());
sinonimos.set(palabra, new ArrayList<>());

答案 2 :(得分:1)

其他两个答案是正确的。我将添加此图形以使问题和解决方案可视化。

diagram

复制列表

或者,如果您希望第二个列表基于第一个列表的内容,请进行复制。要进行复制,请将第一个列表提供给第二个列表的构造函数。

sinonimos.set( palabra , new ArrayList<>( firstArrayList ) ) ;

将创建一个全新的单独列表。但是两个列表中的元素都指向相同的内容对象。因此,请注意那些元素对象是可变的或immutable

相关问题