保存为arraylist元素的Hashtable在分配到arrayelement后清除Hashtable时会丢失值

时间:2012-06-15 15:04:43

标签: java arraylist hashtable

请指教..在以下代码中(已测试。将正常工作)

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
    }
}

我希望看到一个带有Hashtables的arraylist保存为数组元素,第一个带有键'Key1'和'Key2',第二个带有Keys'Key3'和'Key4'。我得到一个带有两个哈希表的数组列表,但哈希表中的值和键将作为两个表的'Key3'和'key4'。有人可以解释一下如果它是一个引用问题,如何在不创建多个哈希表的情况下将两个哈希表放入不同的数组元素中(我必须在for循环中运行代码以添加多个哈希表。每次都不会创建单独的哈希表好)

3 个答案:

答案 0 :(得分:3)

此行是一个很大的nono

objHashTable.clear();

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

此外,Microsoft和大多数现代编程世界都建议您远离匈牙利命名惯例。查看有关该主题的一些讨论:Hungarian notation in C#

答案 1 :(得分:2)

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

您需要为每个索引创建 HashTable

答案 2 :(得分: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);
              }

    }


    }
}