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     }

 

由上總結:

           第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,改變的是同一塊內容,除了變量名稱不同,其余完全相同

運行結果如下:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM