java - 清除 ArrayList 会导致此 ArrayList 中的数据传递到类构造函数也被清除

标签 java android arraylist

我在 Java(Android Studio) 中遇到了如此奇怪的行为。我一直在做的是用一些数据填充字符串的 ArrayList。然后使用该 ArrayList 实例化一个对象,然后将新对象添加到该对象类型的另一个 ArrayList 中。

这是该类的构造函数:

    protected ArrayList<String> languages;
    public Person(ArrayList<String> languages)
    {
        this.languages=languages;
    }

然后在 Activity 中,我使用两个 ArrayList,一个称为 languages,一个称为 Persons。语言 ArrayList 被传递给在 Persons 中添加的新对象。

ArrayList<String> languages=new ArrayList<String>();
ArrayList<Person> Persons=new ArrayList<Person>();

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_layout);
        .
        .
        .
        .
        .
        .
                english=(CheckBox)findViewById(R.id.english);
                if(anglais.isChecked())
                    languages.add(english.getText().toString());
                Persons.add(new Person(languages));
                Log.i("test: ",Persons.get(0).getLangues().get(0)); // Will show English
                languages.clear(); // Here I clear the languages ArrayList so I can add new languages for another person
                Log.i("test: ",Persons.get(0).getLangues().get(0)); // Produces an exception.
            }
        });
    }

如您所见,我首先填充语言,然后使用语言使用新对象填充 Persons。为了添加另一个使用不同语言的人(例如),我必须清除语言 ArrayList,以便我可以重新使用它。

为了测试实际发生的情况,我发现第一个日志将显示添加的语言(请注意,我从 Persons 获取语言,而不是语言)。然而,第二个日志将产生一个异常,指出 Person 类中的语言数组为空(已清除)。是什么原因导致clear函数不仅清除了语言数组,而且还清除了Person类中的语言数组?

最佳答案

当您调用 Person 类的构造函数时,您将传递对语言 ArrayList 对象的引用;对同一 block 内存的引用。使用引用之一调用方法或更改变量将更改对象本身,这意味着对该对象的所有引用也将被更改。为了更好地理解这一点,您应该了解变量是如何工作的。在Java中,变量是对一 block 内存的引用;您可能对这段内存有多个引用。

public static void main(String args[]) {
    ArrayList<String> list = new ArrayList<>();
    ArrayList<String> newReference;
    list.add("String1");
    list.add("String2");
    list.add("String3");
    newReference = list;
    newReference.remove(0); // This will remove the item in the first index of the object. This will remove from both list and newReference as they are currently referencing the same object.
    newReference = list.clone();
    newReference.remove(0); // This will remove the item in the first index of the object referenced by newReference. It is not the same as that of list as you have cloned the data to a new segment of memory.
}

关于java - 清除 ArrayList 会导致此 ArrayList 中的数据传递到类构造函数也被清除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47956982/

相关文章:

java - 如何从 Java 发送 SMTP 消息?

android - Glide - 无法解析方法覆盖

java - 如何从测试器类访问/更改 ArrayList?

java - 如果用户输入空格则循环

java - 在 Java 代码中运行 groovy 脚本

java - OpenGL:读取帧缓冲区的深度纹理

java - 如何使用空的ArrayList创建构造函数?

java - 无法连接到 Google Play 服务;获取取消状态代码

android - 在 Android Studio 中使用改造将 API key 放在哪里

java - 处理对象数组