有下面一段代码public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("one");
list.add("two");
list.add("three");
List<HashMap<String, Object>> list1 = new ArrayList<HashMap<String, Object>>();
HashMap<String, Object> map = new HashMap<String, Object>();             ///// 1
for (int i = 0; i < list.size(); i++) {
                   //HashMap<String, Object> map = new HashMap<String, Object>();      ////  2
map.put("index", list.get(i));
System.out.println(map.get("index"));
list1.add(map);
}
for (int i = 0; i < list1.size(); i++) {
System.out.println(list1.get(i).get("index"));
}
}
我的最终目的是让list1可以输出 one two three这样的值。如果保留1,注释掉2list1里面的值都是three。请问大神为什么?map虽说不是每次new的,但每次不也是重新复制了么。为什么最后list1的值是相同的?java基础

解决方案 »

  1.   

    HashMap<String, Object> map = new HashMap<String, Object>();  
    这句放循环里就可以了,这是新手经常犯的一个错误,你在循环外创建,在循环里一直操作的是循环外边的那个对象。你说的另外一个问题的原因是map的key值不可以重复也就是put的第一个参数,你都放的"index"后边就把前边的替换掉了
      

  2.   

    晕!
    1、你循环里加入到list1里的的map都是同一个map,所以list1里存的是同一个相同的map。
    2、为什么键index的值都是three呢,那是因为你每次循环都重新更新键index的值,最后一次更新的值是three。上述两点加起来,得出的结论就是:list1里存的所有map的键index的值都是three
      

  3.   

    原因很简单,map.put("index", list.get(i))每次用list.get(i)去覆盖了key=index的值,所以最后map中就一个键值对index=list.get(最后一个)
      

  4.   

    放里面new多个map对象应该就可以了。
    一个map对象的key和value。
    key唯一
      

  5.   

    map虽说不是每次new的,但每次不也是重新复制了么。
    你三次加入的map对象是同一个,而且每次map里的index值都被改变了,所以保留的是最后一次修改的结果。
      

  6.   

    因为在java的list中存放的是对象的引用不是值,所以list1.get(i)是获得map的引用,引用最后指向的值都是three。