List.addAll()操作总结

来源:互联网 发布:unity3d小球滚动 编辑:程序博客网 时间:2024/05/29 02:45
List引用一
  1. List<Person> persons = PersonService.getPersonsByAgeIn(18,23);//初始化一个Person的List。  
  2. List<Person> backPersons = persons;  
显然,对backPersons的操作会直接改变persons的数据。
backPersons只是定义了一个数据引用,并没有初始化申请空间。现在的backPersons就是persons。

那么,换以下方式呢?

public class TestListYinyong {    public static void main(String[] args) {        Person person=new Person("1111");        Person person1=new Person("2222");        Person person2=new Person("3333");        List<Person> personList=new ArrayList<>();        personList.add(person);        personList.add(person1);        personList.add(person2);        for (Person person0:personList){            System.out.println("最开始的personList   "+person0.getName());        }        //改变person的值是会影响原来的personList的(会改变personList的值)        System.out.println();System.out.println();System.out.println();        List<Person> personList2=new ArrayList<>();        personList2=personList;        personList2.get(0).setName("111111111111");        for (Person person0:personList){            System.out.println("改变personList2中的person的值后的personList   "+person0.getName());        }}
输出结果:
最开始的personList   1111最开始的personList   2222最开始的personList   3333改变personList2中的person的值后的personList   111111111111改变personList2中的person的值后的personList   2222改变personList2中的person的值后的personList   3333

所以结果就是:如图两个list同时引用同一个list对象


List引用二:list.addAll()

  1. List<Person> persons = PersonService.getPersonsByAgeIn(18,23);//初始化一个Person的List。  
  2. List<Person> backPersons = new ArrayList<Person>();  
  3. backPersons.addAll(persons);  
这样给backPerson赋值之后再操作内部数据,此处分两种情况,如果对backPersons的操作是在List层的操作,对persons没有影响。也就是说,如果backPersons只是对内部数据做了简单的删除、排序或者添加等操作。但是,如果操作深入到List内部数据层,那么backPersons数据修改就会影响到persons的数据。

原因很简单,backPersons中的每一个Person都是persons一样的Person。那么,操作对象的时候就会有影响。

总结:对对象操作对原来的list会有影响,list层的操作对原来的list不会有影响。

public class TestListYinyong { public static void main(String[] args) { Person person=new Person("1111"); Person person1=new Person("2222"); Person person2=new Person("3333"); List<Person> personList=new ArrayList<>(); personList.add(person); personList.add(person1); personList.add(person2); for (Person person0:personList){ System.out.println("最开始的personList "+person0.getName()); } //改变person的值是会影响原来的personList的(会改变personList的值) System.out.println();System.out.println();System.out.println(); List<Person> personList2=new ArrayList<>(); personList2.addAll(personList); personList2.get(0).setName("111111111111"); for (Person person0:personList){ System.out.println("改变personList2中的person的值后的personList "+person0.getName()); } //对personList2增加数据,看一下对personList的影响(对personList没影响) System.out.println();System.out.println();System.out.println(); personList2.add(new Person("4444")); for (Person person0:personList){ System.out.println("对personList2增加数据后的personList "+person0.getName()); } //对personList2删除数据,看一下对personList的影响(对personList没影响) System.out.println();System.out.println();System.out.println(); personList2.remove(0); System.out.println(); for (Person person0:personList){ System.out.println("对personList2删除数据后的personList "+person0.getName()); } //清空personList2数据,看一下对personList的影响(对personList没影响) System.out.println();System.out.println();System.out.println(); personList2.clear(); System.out.println(); for (Person person0:personList){ System.out.println("清空personList2数据后的personList "+person0.getName()); } }}

输出结果:
最开始的personList   1111
最开始的personList   2222
最开始的personList   3333


改变personList2中的person的值后的personList   111111111111
改变personList2中的person的值后的personList   2222
改变personList2中的person的值后的personList   3333


对personList2增加数据后的personList   111111111111
对personList2增加数据后的personList   2222
对personList2增加数据后的personList   3333


对personList2删除数据后的personList   111111111111
对personList2删除数据后的personList   2222
对personList2删除数据后的personList   3333


清空personList2数据后的personList   111111111111
清空personList2数据后的personList   2222

清空personList2数据后的personList   3333


List.addAll()三

addAll是传入一个List,将此List中的所有元素加入到当前List中,也就是当前List会增加的元素个数为传入的List的大小

即addAll(Collection c)
   add(int index,Elelemt e)

--------------------------------------

addAll(Collection c)

此方法按照指定 collection 的迭代器所返回的元素顺序,将该 collection 中的所有元素添加到此列表的尾部

C

包含要添加到此列表中的元素的 collection

return

如果此列表由于调用而发生更改,则返回 true

Throws

NullPointerException: 如果指定的 collection 为 null


0 0