【问题标题】:Setting values in ArrayList with changing variables modify values of ArrayList [duplicate]使用更改变量在 ArrayList 中设置值会修改 ArrayList 的值 [重复]
【发布时间】:2018-01-10 15:47:43
【问题描述】:

我在使用 ArrayList 时遇到问题。我正在使用包含此内容的 ArrayList:

字符串、整数、哈希表、哈希表

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

对此有任何帮助吗?

【问题讨论】:

  • ArrayLists 涉及哪些方面?基元和对象的行为不同,因为在 Java 中,一切都是按值传递的。您传递原语的值。您传递对象引用的引用值。所以最后h_gainh_tmp2(顺便说一下名字很烂,变量名请用camelCase)引用同一个Hashtable
  • 当使用对象时,您不能像 int 这样的原始类型一样复制/克隆它们。例如:List&lt;String&gt; a = new ArrayList; List&lt;String&gt; b = a; 只会创建一个 List 并且在同一个 List 上有两个不同的变量点。
  • @OHGODSPIDERS Java 中没有指针;)这些是引用。
  • 我可以指出我从来没有声称有,但这是一个注释而不是指针,所以它不能指向任何东西,对吧?
  • @Turing85 好吧,我不知道按值或引用传递,我想我明白了。对于命名,我会改变它;)

标签: java arraylist hashtable


【解决方案1】:

我想我可以为你回答这个问题。 您可能会认为插入后 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 不会插入旧对象的引用,而是插入新克隆对象的引用(确实)不再更改。这就是您现在可以更改旧值的原因。

【讨论】:

  • 值得一提的是h_gain.clone() only creates a shallow copy。如果不加以考虑,这可能会导致令人困惑的行为。
  • @Turing85 其实这解决了第一部分的问题。但正如你所说,内容似乎没有被复制。所以我的问题是:如何克隆结构和内容?
  • @Gilles 如果您描述您要解决的实际问题而不是展示您部署的解决方案,那会容易得多。听起来越来越像XY-problem
  • @Turing85 好吧,我试图解释我的问题,但我不能,所以我认为这可能是一个概念问题。我想出了如何以另一种方式处理我的程序,它现在可以工作了。我的变量都被重命名了;)谢谢!
猜你喜欢
  • 2019-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多