List引用一
- List<Person> persons = PersonService.getPersonsByAgeIn(18,23);//初始化一个Person的List。
- 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()
- List<Person> persons = PersonService.getPersonsByAgeIn(18,23);//初始化一个Person的List。
- List<Person> backPersons = new ArrayList<Person>();
- 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 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 |