List.addAll() 與=的區別面試題

再次被面試問到  回答錯了,所以記錄一下

public class Person {

    public int age;
    public String name;

    public Person(String name, int age){
        this.name = name;
        this.age = age;
    }
    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Person{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
}

 

 

@Test
    public void testList(){
        ArrayList<Person> list1 = new ArrayList<Person>();
        list1.add(new Person("zhangsan",13));
        list1.add(new Person("lisi",14));
        list1.add(new Person("wanger",15));


        ArrayList<Person> list2 = new ArrayList<Person>();
        list2.addAll(list1);   

        list1.add(new Person("suanliu",16));
        Iterator<Person> iterator =  list1.iterator();
        while (iterator.hasNext()){
            Person value = iterator.next();
            System.out.println("value1 =" + value.toString());
        }

        list2.remove(0);
        Iterator<Person> iterator2 =  list2.iterator();
        while (iterator2.hasNext()){
            Person value = iterator2.next();
            System.out.println("value2 =" + value.toString());
        }
    }

 

 

 

 

由上總結:

           第3行 在堆上爲list1分配了一個地址849(在棧上同時也開了一塊內存,內存名稱叫list1,值爲849), 4,5,6行創建了3個對象堆地址分別爲:859 860 861 ,849行對 859 860 861持有了引用

          第9行 在堆上爲list2分配了一個地址850, 第10行,將849持有的引用copy一份賦值給了850,也就是 850也持有了對859 860 861的引用

          第12行  又創建了一個person對象,對象地址862,同時將引用加到了list1地址也就是849中,這個時候849持有了4個person對象引用:859 860 861 862,

         第19行 list2 remove掉了對859的引用只剩下了 860,861的引用,這個時候 859還是不能釋放的,因爲list1 849還持有

若果在第10行改爲:list2 =list1;第9行雖然給list2在堆上開了一塊內存850,但第10行 list2的地址改爲849 也就是兩個變量指向堆上相同的地址,以後的操作不論list1,list2,改變的是同一塊內容,除了變量名稱不同,其餘完全相同

運行結果如下:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章