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,改变的是同一块内容,除了变量名称不同,其余完全相同

运行结果如下:

posted on 2017-12-07 14:49  飞舞z2q  阅读(4604)  评论(0编辑  收藏  举报