再次被面試問到 回答錯了,所以記錄一下
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,改變的是同一塊內容,除了變量名稱不同,其餘完全相同
運行結果如下: