【发布时间】: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_gain和h_tmp2(顺便说一下名字很烂,变量名请用camelCase)引用同一个Hashtable。 -
当使用对象时,您不能像 int 这样的原始类型一样复制/克隆它们。例如:
List<String> a = new ArrayList; List<String> b = a;只会创建一个 List 并且在同一个 List 上有两个不同的变量点。 -
@OHGODSPIDERS Java 中没有指针;)这些是引用。
-
我可以指出我从来没有声称有,但这是一个注释而不是指针,所以它不能指向任何东西,对吧?
-
@Turing85 好吧,我不知道按值或引用传递,我想我明白了。对于命名,我会改变它;)