我在使用ArrayList时遇到了问题。我正在使用带有此内容的ArrayList:
String,int,HashTable,HashTable
HashTables由String键和int值组成。
在我的程序中的某个时刻,我需要设置两个HashTable的值。例如,如果我使用HashTable h_gain设置ArrayList(2)(所以第一个哈希表),然后我清除h_gain,之前使用正确内容分配的值将设置为null(因为h_gain现在为空)。
a_j1.set(2, h_gain);
Hashtable<String, Integer> h_tmp2 = (Hashtable<String, Integer>) a_j1.get(2);
// Gives the right value - like 1000 for example
System.out.println("TESSSSSSSSSSSSSST " + h_tmp2.get("En plein"));
h_gain.clear();
// Gives me null
h_tmp2 = (Hashtable<String, Integer>) a_j1.get(2);
System.out.println("TESSSSSSSSSSSSSST " + h_tmp2.get("En plein"));
我不明白为什么它会像这样。如果我只是使用变量来执行,则行为更像预期
int val1 = 10
int val2 = val1 // val2 = 10
val1 = 0 // Well, val2 is still = 10
对此有何帮助?
答案 0 :(得分:1)
我想我可以为你回答这个问题。 您可能认为插入后ArrayList中有另一个对象,但实际上并非事实。
你的a_j1中引用了对象h_gain。 通过清除h_gain,您还清除了a_j1中的对象,因为这只是一个引用。当你必须清除h_gain时,我建议在将对象插入a_j1之前克隆/复制你的对象。
所以试试这个:
a_j1.set(2, h_gain.clone());
Hashtable<String, Integer> h_tmp2 = (Hashtable<String, Integer>) a_j1.get(2);
System.out.println("TESSSSSSSSSSSSSST " + h_tmp2.get("En plein"));
h_gain.clear();
h_tmp2 = (Hashtable<String, Integer>) a_j1.get(2);
System.out.println("TESSSSSSSSSSSSSST " + h_tmp2.get("En plein"));
不同之处在于,Java不会插入旧对象的引用,而是插入新的克隆对象(实际上)不再更改。这就是你现在可以改变旧价值的原因。