Java 在映射中列出值

Java 在映射中列出值,java,list,dictionary,Java,List,Dictionary,我希望将列表添加到映射,但无法获得所需的映射输出。 有什么方法可以获得以下所需的输出 List l = new ArrayList(); Map<String, List<Object>> mp = new HashMap(); l.add("A"); mp.put("1", l); l.clear(); l.add("B"); mp.put("2", l); System.out.println

我希望将列表添加到映射,但无法获得所需的映射输出。 有什么方法可以获得以下所需的输出

    List l = new ArrayList();

    Map<String, List<Object>> mp = new HashMap();

    l.add("A");

    mp.put("1", l);

    l.clear();
    l.add("B");

    mp.put("2", l);

    System.out.println(mp);
listl=newarraylist();
Map mp=新的HashMap();
l、 添加(“A”);
议员:付诸表决(“1”,l);
l、 清除();
l、 添加(“B”);
议员:付诸表决(“2”,l);
系统输出打印项次(mp);
应为:{1=[A],2=[B]}

实际值:{1=[B],2=[B]}

List l=new ArrayList();
    List l = new ArrayList();

    Map<String, List<Object>> mp = new HashMap();

    l.add("A");
    mp.put("1", l);

    l = new ArrayList();        
    l.add("B");
    mp.put("2", l);

    System.out.println(mp);
Map mp=新的HashMap(); l、 添加(“A”); 议员:付诸表决(“1”,l); l=新的ArrayList(); l、 添加(“B”); 议员:付诸表决(“2”,l); 系统输出打印项次(mp);
列表是通过引用传递的,所以您需要创建两个不同的列表

List l1 = new ArrayList();
l1.add("A");

List l2 = new ArrayList();
l2.add("B");

Map<String, List<Object>> mp = new HashMap();
mp.put("1", l1);
mp.put("2", l2);

System.out.println(mp);
List l1=new ArrayList();
l1.添加(“A”);
列表l2=新的ArrayList();
l2.添加(“B”);
Map mp=新的HashMap();
mp.put(“1”,l1);
议员:付诸表决(“2”,l2);
系统输出打印项次(mp);

即使清除了
列表中的值
地图仍在引用原始
列表
,因此对该列表所做的任何更改也会影响原始位置

请看根据您的代码修改的示例:

Map<String, List<Object>> mp = new HashMap<>();

for (int k = 65; k <= 91; k++) {
    List<Object> l = new ArrayList<>();
    l.add((char)k);
    mp.put(Integer.toString(k), l);
}

System.out.println(mp);
现在将打印以下内容:

{66=[]、88=[]、67=[]、89=[]、68=[]、69=[]、90=[]……等等

映射中的每个
列表
值都为空,因为它们都引用了最后清除的相同列表

现在看起来很明显,它们都会被清除,因为在循环内部,我们没有在每次迭代中清除
列表
,而是将所有值一起添加到
列表
,所以很明显
映射
引用的是相同的
列表

但是,使用
clear
与是否引用相同的
列表无关,它只是让人觉得您并没有将所有的值添加到同一个列表中,而是添加到了同一个列表中。

您正在一次又一次地更新同一个列表,创建新列表非常感谢,它解决了我的问题,非常感谢helped@Barca当然可以,艾尔因此,我建议研究一下
List
List
之间的区别,因为它们不是一回事。
char
是一个UTF-16代码单元,其中一个或两个编码一个Unicode码点;与ASCII无关。@Tom Budget我并不是在谈论幕后发生的事情,而不仅仅是poi代码的一部分是打印ASCII表值作为其功能,这与UTF16和ASCII相同。我觉得字符的细节与问题无关。比如说它使用的方法是was
displayScii
,你可以使用UTF16来实现,但这并不意味着65不是ASCII中的一个。这是关于Java不用于文本数据类型的字符编码,这个问题也不问。
Map<String, List<Object>> mp = new HashMap<>();

List<Object> l = new ArrayList<>();
for (int k = 65; k <= 91; k++) {
    l.add((char)k);
    mp.put(Integer.toString(k), l);
}

l.clear();
System.out.println(mp);