【问题标题】:HashMap values getting reinitialized in a loopHashMap 值在循环中重新初始化
【发布时间】:2014-07-20 12:56:51
【问题描述】:

这是我的代码。

public class Test {
    public static void main(String[] args) {                
        ArrayList<Integer> temp = new ArrayList<Integer>();
        HashMap<Integer, ArrayList<Integer>> map = new HashMap<Integer, ArrayList<Integer>>();
        int serialno = 0;

        for (int i = 1000; i < 1004; i++) {
            temp.clear();

            temp.add(i);
            temp.add((i+1000));

            map.put(serialno++, temp);
        }
        System.out.println(map);
    }
}

我希望输出是

{0=[1000, 2000], 1=[1001, 2001], 2=[1002, 2002], 3=[1003, 2003]}

但我得到的输出为

{0=[1003, 2003], 1=[1003, 2003], 2=[1003, 2003], 3=[1003, 2003]}

这里发生了什么。?我哪里做错了?

【问题讨论】:

  • 您正在重用相同的哈希图,因此显然任何序列号的值都是相同的。
  • 当您将对象put 放入地图(或列表)时,对象不会被复制。而是将对象的“引用”(指针)放入 Map 中。

标签: java collections arraylist hashmap


【解决方案1】:

在清除 ArrayList temp 时,您所做的只是删除它的值。但是,当您将 ArrayList 放入地图时,实际上您将 ArrayList 的对象引用放入了地图中,而 不是 具有新值的新列表。因此,在您的地图中,ArrayList 是相同的四倍(因此是相同值的四倍)。

 HashMap<Integer, ArrayList<Integer>> map = new HashMap<Integer, ArrayList<Integer>>();
 int serialno = 0;

 for (int i = 1000; i < 1004; i++) {
      ArrayList<Integer> temp = new ArrayList<Integer>();
      temp.add(i);
      temp.add((i + 1000));
      System.out.println(i + 1000);

      map.put(serialno++, temp);
 }
 System.out.println(map);

当你在每个循环中创建一个新的 List 时,你实际上会在 map 中放置不同的 ArrayList(具有不同的引用)。

【讨论】:

    【解决方案2】:

    您只创建了一个 ArrayList 对象并将其乘以到 HashMap 中,因此您在 HashMap 中有许多对同一对象的引用,但您想要多个 ArrayList 对象,所以您有在你的循环中创建它们。

    public class Test {
        public static void main(String[] args) {
            HashMap<Integer, ArrayList<Integer>> map = new HashMap<Integer, ArrayList<Integer>>();
            int serialno = 0;
    
            for (int i = 1000; i < 1004; i++) {
                ArrayList<Integer> temp = new ArrayList<Integer>();
    
                temp.add(i);
                temp.add((i+1000));
    
                map.put(serialno++, temp);
            }
    
            System.out.println(map);
        }
    }
    

    【讨论】:

    • “temp = new ArrayList()”和“temp.clear()”有什么区别
    • temp.clear()从同一个对象中删除项目所以你得到相同的结果,你需要在每次旋转时创建一个新对象
    猜你喜欢
    • 2019-03-08
    • 1970-01-01
    • 2014-07-17
    • 1970-01-01
    • 1970-01-01
    • 2022-12-06
    • 1970-01-01
    • 2021-05-31
    • 1970-01-01
    相关资源
    最近更新 更多