java - 通过更改变量来设置 ArrayList 中的值会修改 ArrayList 的值

标签 java arraylist hashtable

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

相关文章:

java - 你能从 javascript 读取 flash 吗?

Java - ByteBuffer 还是 ArrayList<Byte>?

java - 获取Java嵌套ArrayList中的元素个数

algorithm - 哈希表 : Search vs successor time complexity

javascript - 解决方法 : javascript dictionary which takes objects as keys

java - 从 JSON Schema 动态创建 Swing GUI(使用 Metawidget)

java - 在 Java 中 DB2 JDBC : How can one use null parameters in a WHERE clause for a SELECT statement where the value can be either null or not null?

java - 使用数据文件进行 Junit 测试

java - Restful API 的读取列表

c++ - 哈希表 - 条件跳转或移动取决于未初始化的值