清除ArrayList会导致传递给类构造函数的此ArrayList中的数据也清除

时间:2017-12-23 23:49:11

标签: java android arraylist

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

以下是该类的构造函数:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="one">1</div>
<div class="one two">2</div>
<div class="one two three">3</div>
<div class="one">1</div>

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

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

正如您所看到的,我首先填充语言,然后使用语言使用新对象填充Persons。为了添加具有不同语言的其他人(例如),我必须清除语言ArrayList,以便我可以重复使用它。

为了测试实际发生的情况,我发现第一个Log会显示添加的语言(注意我从Persons获得语言,而不是语言)。但是,第二个Log将产生一个异常,表明langauges数组IN Person类为空(已清除)。什么可能导致clear函数不仅清除语言数组,而且还清除Person类中的语言数组?

1 个答案:

答案 0 :(得分:1)

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

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.
}