【问题标题】:adding string to one ArrayList adds the string to this and to another ArrayList (Android)将字符串添加到一个 ArrayList 将字符串添加到这个和另一个 ArrayList (Android)
【发布时间】: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@后面的数字表示内存中的地址,你可以看到它们是一样的
  • 不是内存地址。它是哈希码。

标签: java android arraylist


【解决方案1】:

很明显,您的两个变量都指向同一个 ArrayList 实例,而且我们知道 Java 肯定可以很好地处理引用,因此我们必须假设某些代码存在问题,而您没有将这些代码包含在您所在的位置做类似arrayList1 = arrayList2

如果您发布了重现问题的精简代码示例,那么我们可以提供更多帮助。

【讨论】:

    【解决方案2】:

    在oncreate()上面声明private ArrayList arrayList1=new ArrayList();,确保你没有使用array1=array2array1.addAll(array2 ) 等等....

    【讨论】:

      【解决方案3】:

      可能看起来很愚蠢,但你有没有尝试过:

      arrayList1.add("string1");
      arrayList2.add("string2");    
      

      如果不是这样,指针、Java 和您的 PC 设置似乎有问题。

      【讨论】:

        【解决方案4】:

        尝试创建带有声明的对象

        private ArrayList<String> arrayList1=new ArrayList<String>(); 
        private ArrayList<String> arrayList2=new ArrayList<String>();
        

        最好指定String,数组中项的类型

        【讨论】:

        • 不,不是。第二个 是多余的,在 java 7 中被菱形符号取代
        猜你喜欢
        • 1970-01-01
        • 2020-04-13
        • 1970-01-01
        • 2013-08-13
        • 1970-01-01
        • 2017-01-11
        • 1970-01-01
        • 2012-11-21
        相关资源
        最近更新 更多