Map<String,List<String>> map=new HashMap<String,List<String>>();
List<String> li=new ArrayList<String>();
  li.add("123");
  map.put("a", li);
  li.clear();
  li.add("321");
  map.put("b", li);
System.out.println(map.get("a").get(0));
System.out.println(map.get("b").get(0));都是321  why?

解决方案 »

  1.   

    List <String> li=new ArrayList <String>();  
    map.put("a", li);
    map.put("b", li); 
    都是指向相同地址,只要li里面的值一变  两个都跟着变的。
      

  2.   

    li是一个引用,假设它指向的内存地址为A区
    则li.add("123"),即向A区存放了个“123”的数据  (现在A区存有“123“)
    li.clear(),是把A区存放是数据清空     (现在A区无数据)
    li.add("321"); 向A区添加了数据”321“  (现在A区存有“321“) map.put("a", li); 
     map.put("b", li); 
    map存放的只是li这个引用,它指向的是A区
    所以都是321
      

  3.   

    同一个LIST
    而你中间clear了一把,所以里面就只有一个321了。
      

  4.   

    map这种机制也太差了吧
        依赖于别的类,给人感觉放进去了,但不一定能取出来
      

  5.   

    LIST是地址引用  你放入MAP的只是LIST的地址而已 , 所以你修改LIST的内容的时候,但是却没有修改你把LIST存入MAP的地址,所以MAP取出来的值是一样的
      

  6.   


    每次要put的时候new一个新的就好了呀。你clear干啥