[英]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.