【发布时间】:2015-06-16 18:51:08
【问题描述】:
我在使用 arrayLists 时遇到了一个奇怪的问题。我声明并初始化其中两个:
private ArrayList<String> arrayList1;
private ArrayList<String> arrayList2;
[..]
public void onCreate(Bundle savedInstanceState) {
[..]
arrayList1 = new ArrayList<>();
arrayList2 = new ArrayList<>();
}
当我向其中一个添加字符串时,它会自动添加到另一个:
arrayList1.add(new String("string1"));
两者都发生在这一行,我已经使用断点检查了很多次。起初我认为它必须与传递引用而不是值有关,我将 .add("string1") 更改为 .add(new String("String1")) 但它不起作用。
过了一会儿,我注意到这两个数组的 Id 显示 Logcat 相同:
arrayList1 = {java.util.ArrayList@830033171248} size = 1
arrayList2 = {java.util.ArrayList@830033171248} size = 1
也许这是造成问题的原因,但我无法想象为什么会发生这种情况以及如何解决它。我是从android开发开始的,所以也许这是一个愚蠢的问题,但我试图找到解释很长时间没有成功。 非常感谢! 问候!
编辑:
- 我更改了两个arrayList的名称和代码中的位置,问题似乎消失了。我正在尝试再次重现该问题。
代码中没有类似arrayList1 = arrayList2的东西。
在 onCreate 方法初始化 arrayLists 时,ArrayList@ 后面的数字不同,但我不知道为什么,也不知道它在哪里意外地在未知的地方发生了变化。我在每种方法都有断点,并且数组的地址在其中任何一个中都没有改变。我在 UI 中有几个复选框,当我选中其中一个时,在复选框的侦听器中,我可以看到 arrayLists 的地址(ArrayList@ 之后的数字)已经改变并且变得相同。很烦很奇怪。
【问题讨论】:
-
您确定某处不会发生这种情况:
arrayList2 = arrayList1;? -
完全确定。谢谢回复
-
@AlbertoC:那肯定正在发生。它不在您向我们展示的代码中,因此您需要找出它实际发生的位置。某事,某处给这两个变量相同的值。
-
注意你的日志,
ArrayList@后面的数字表示内存中的地址,你可以看到它们是一样的 -
不是内存地址。它是哈希码。