(一) list的存,移除和清空
方法1
public static void testList(int i){
list.add(i);
System.out.println(list.get(0));
list.remove(i);
System.out.println(list.size());
}
方法2
public static void testList(Integer i){
list.add(i);
System.out.println(list.get(0));
list.remove(i);
System.out.println(list.size());
}
在执行了两个方法后会有什么不同的结果?执行方法1后由于传入的是int基本类型,所以在list.add(1)的时候已经将int型的1自动转换为Integer对象了,这叫java的自动装箱。所谓自动装箱,就是原始数据类型(int, long, double, float, boolean等),在需要的时候自动封装成对应的类的对象(Integer, Long, Double, Float, Boolean等)。因为add()方法只支持存放对象,所以需要装箱,而在list.remove(i)时候list提供了两个remove的方法,分别是整形和对象类型,整形用于根据list索引下标直接找到对象并移除,而对象则是直接找到对象并移除,因此在此处执行list.remove(i)就会被编译器立即为根据下标找对象,而当前只添加了一个对象到List,下标起始位应该为0,因此Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 1, Size: 1这个错误就是必然的了。而执行方法2则避免了这个问题,直接移除了存入的对象。
方法3
public static void testList(){
List<String> list = new ArrayList<String>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
List<String> listB = new ArrayList<String>();
listB.add("ddd");
listB.add("eee");
listB.add("ccc");
list.removeAll(listB);
System.out.println("list的个数为:"+list.size()+ "-->"+list.get(0)+" "+list.get(1));
}
结果为 : list的个数为:2-->aaa bbb 显然,list.removeAll(listB)方法删除了list中与listB共同存在的'ccc'项.那如果将list.removeAll(listB)替换为list.retainAll(listB) 结果为 : list的个数为:1-->ccc ,也就是说retainAll方法删除了list中与listB不同的元素只保留了2者相同项。
方法3
list.clear(); 这个方法能够清空list中所有元素。
(二) list的之间的增量添加
public static void testList(){
List<String> list = new ArrayList<String>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
List<String> listB = new ArrayList<String>();
listB.add("ddd");
listB.add("eee");
list.addAll(0,listB);
System.out.println("list的个数为:"+list.size()+ "-->"+list.get(0)+" "+list.get(1)+" "+list.get(2)+" "+list.get(3)+" "+list.get(4));
}
结果为: list的个数为:5-->ddd eee aaa bbb ccc 可以看出list.addAll(0,listB);是将listB对象中的元素按指定的索引添加到list中,当前给的索引值是0,因此ddd eee 在最前面出现。
public static void testList(){
List<String> list = new ArrayList<String>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
List<String> listB = new ArrayList<String>();
listB.add("ddd");
listB.add("eee");
listB.add("ccc");
list.addAll(listB);
List<String> listC = list.subList(2, 3);
System.out.println("list的个数为:"+list.size());
System.out.println("listC的个数为:"+listC.size()+" "+listC.get(0));
}
该方法执行结果:
list的个数为:6
listC的个数为:1 ccc
因为执行了list.addAll(listB);所以list的个数是6 , 执行了List<String> listC = list.subList(2, 3);所以返回了一个新的listC结果为 ccc
public static void testList(){
List<String> list = new ArrayList<String>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
List<String> listB = new ArrayList<String>();
listB.add("ddd");
listB.add("eee");
listB.add("ccc");
list.addAll(listB);
//list.remove("eee");
if(list.contains("ccc"))
System.out.println("包含 ccc ");
if(list.containsAll(listB)){
System.out.println("包含 listB");
}else{
System.out.println("不包含 listB");
}
}
运行结果为 : 包含 ccc ,包含 listB 但我们取消list.remove("eee");的注释后发现第二句变成了:不包含 listB ,也就是说list.containsAll是判断list里面是否包含全部的listB的元素,缺一不可。
list的迭代功能
public static void testList(){
List<String> list = new ArrayList<String>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
List<String> listB = new ArrayList<String>();
listB.add("ddd");
listB.add("eee");
listB.add("ccc");
list.addAll(listB);
Iterator<String> itor = list.iterator();
Object str ;
while(itor.hasNext()){
str = itor.next();
itor.remove();
System.out.println(str);
}
if(list.contains("ccc"))
System.out.println("包含 ccc ");
if(list.containsAll(listB)){
System.out.println("包含 listB");
}else{
System.out.println("不包含 listB");
}
}
此功能是在不知道list中所存放的类型情况下使用便利的方式得到数据。每遍历一次调用itor.remove()即可将该层次的对象移除。也就是list中的元素被一个个的移除,那么再执行的话结果就会是 :
aaa
6
bbb
5
ccc
4
ddd
3
eee
2
ccc
1
不包含 listB