0

请告知..在以下代码中(经过测试。可以正常工作)

public class Exp_Test { 
     public static void main (String[] args) {
        ArrayList<Hashtable> objArrlistHshTbl = new ArrayList<Hashtable>();

        Hashtable objHashTable = new Hashtable();

        objHashTable.put("Key1", "Value1");
        objHashTable.put("Key2", "Value2");

        objArrlistHshTbl.add(objHashTable);

        objHashTable.clear();

        objHashTable.put("Key3", "Value3");
        objHashTable.put("Key4", "Value4");

        objArrlistHshTbl.add(objHashTable);
        System.out.println("Hi");//put a breakpoint here to check the values
    }
}

我期待看到一个带有哈希表的数组列表保存为数组元素,第一个带有键“Key1”和“Key2”,第二个带有键“Key3”和“Key4”。我得到一个包含两个哈希表的数组列表,但是哈希表中的值和键对于这两个表都是“Key3”和“key4”。有人可以解释一下。如果这是一个参考问题,如何在不创建多个哈希表的情况下将两个哈希表放入不同的数组元素中(我必须在 for 循环中运行代码以添加多个哈希表。每次创建单独的哈希表并不好听好的)

4

3 回答 3

3

这条线是一个很大的诺诺

objHashTable.clear();

你必须明白,objHashTable在你的情况下是指向一个对象。当您将其添加到数组时,该数组只会创建指向同一对象的指针。因此,当您对这些指针中的任何一个调用 clear 时,它会清除对象。这是编程中的一个基本概念。您需要创建一个new Hashtable()并将其添加为第二个元素。

此外,微软和大多数现代编程世界都建议您远离匈牙利命名约定。查看有关该主题的一些讨论:C# 中的匈牙利表示法

于 2012-06-15T15:07:51.830 回答
2

ArrayList通过引用存储对象。当你clear objHashTable,objArrlistHshTbl.get(0)被清除。

您需要为每个索引创建一个 HashTable索引。

于 2012-06-15T15:06:24.040 回答
0

解决了

public static void main (String[] args) {
    ArrayList<Hashtable> objArrlistHshTbl = new ArrayList<Hashtable>();
    for(int i= 1; i< 3; i++){
              if(i == 1){
              Hashtable objHashTable = new Hashtable();
    objHashTable.put("Key" + i, "Value1");
    objHashTable.put("Key" + i+1, "Value2");
              objArrlistHshTbl.add(objHashTable);
              }else{
                  Hashtable objHashTable = new Hashtable();
                  objHashTable.put("Key" + i, "Value3");
        objHashTable.put("Key" + i+1, "Value4");
                  objArrlistHshTbl.add(objHashTable);
              }

    }


    }
}
于 2012-06-15T15:11:35.850 回答