使用更改变量在ArrayList中设置值会修改ArrayList的值

时间:2018-01-10 15:47:43

标签: java arraylist hashtable

我在使用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

对此有何帮助?

1 个答案:

答案 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不会插入旧对象的引用,而是插入新的克隆对象(实际上)不再更改。这就是你现在可以改变旧价值的原因。