我在使用 ArrayList 时遇到问题。我正在使用包含以下内容的 ArrayList:
字符串、整数、哈希表、哈希表
哈希表由一个 String 键和一个 int 值组成。
在我的程序中的某个时刻,我需要设置两个哈希表的值。例如,如果我使用哈希表 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
对此有什么帮助吗?
最佳答案
我想我可以回答你这个问题。 您可能认为插入后 ArrayList 内还有另一个对象,但事实并非如此。
对象 h_gain 在 a_j1 中被引用。 通过清除 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 不会插入旧对象的引用,而是插入新克隆对象的引用,而新克隆对象(实际上)不再更改。这就是为什么您现在可以更改旧值的原因。
关于java - 通过更改变量来设置 ArrayList 中的值会修改 ArrayList 的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48191179/