List.addAll() 與=的區別


 

 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

運行結果以下:內存

相關文章
相關標籤/搜索