1 public class Person { 2 3 public int age; 4 public String name; 5 6 public Person(String name, int age){ 7 this.name = name; 8 this.age = age; 9 } 10 public int getAge() { 11 return age; 12 } 13 14 public void setAge(int age) { 15 this.age = age; 16 } 17 18 public String getName() { 19 return name; 20 } 21 22 public void setName(String name) { 23 this.name = name; 24 } 25 26 @Override 27 public String toString() { 28 return "Person{" + 29 "age=" + age + 30 ", name='" + name + '\'' + 31 '}'; 32 } 33 }
1 @Test 2 public void testList(){ 3 ArrayList<Person> list1 = new ArrayList<Person>(); 4 list1.add(new Person("zhangsan",13)); 5 list1.add(new Person("lisi",14)); 6 list1.add(new Person("wanger",15)); 7 8 9 ArrayList<Person> list2 = new ArrayList<Person>(); 10 list2.addAll(list1); 11 12 list1.add(new Person("suanliu",16)); 13 Iterator<Person> iterator = list1.iterator(); 14 while (iterator.hasNext()){ 15 Person value = iterator.next(); 16 System.out.println("value1 =" + value.toString()); 17 } 18 19 list2.remove(0); 20 Iterator<Person> iterator2 = list2.iterator(); 21 while (iterator2.hasNext()){ 22 Person value = iterator2.next(); 23 System.out.println("value2 =" + value.toString()); 24 } 25 }
由上總結:ide
第3行 在堆上爲list1分配了一個地址849(在棧上同時也開了一塊內存,內存名稱叫list1,值爲849), 4,5,6行建立了3個對象堆地址分別爲:859 860 861 ,849行對 859 860 861持有了引用this
第9行 在堆上爲list2分配了一個地址850, 第10行,將849持有的引用copy一份賦值給了850,也就是 850也持有了對859 860 861的引用spa
第12行 又建立了一個person對象,對象地址862,同時將引用加到了list1地址也就是849中,這個時候849持有了4個person對象引用:859 860 861 862,code
第19行 list2 remove掉了對859的引用只剩下了 860,861的引用,這個時候 859仍是不能釋放的,由於list1 849還持有對象
若果在第10行改成:list2 =list1;第9行雖然給list2在堆上開了一塊內存850,但第10行 list2的地址改成849 也就是兩個變量指向堆上相同的地址,之後的操做不論list1,list2,改變的是同一塊內容,除了變量名稱不一樣,其他徹底相同blog
運行結果以下:內存