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