繁体   English   中英

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

[英]Hashtable saved as an arraylist element loses values on clearing the Hashtable after assignment in to arrayelement

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

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”,第二个带有键“ Key3”和“ Key4”。 我得到了带有两个哈希表的数组列表,但是哈希表中的值和键对于这两个表都是'Key3'和'key4'。 有人可以解释。 如果这是一个参考问题,如何在创建多个哈希表的同时将两个哈希表放入不同的数组元素中(我必须在for循环中运行代码以添加多个哈希表。每次听起来都不创建单独的哈希表好)

这条线是一个很大的诺诺

objHashTable.clear();

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

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

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

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

解决了

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

    }


    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM