说实话,最近的S7总决赛严重影响我学习的节奏,在十六进八的淘汰赛之后,我一度想去武汉火车站蹲faker,顺便再把LZ的鼠王带走。但是Lz在八进四小组赛被SSG3:0赶回家,SKT也差点被MSF兔子带走,LPL赛区 RNG WE顺利进入四强,但是我最喜欢的战队是GAM,但是这他妈和我学JAVA有什么关系,把心收回来,该玩玩,该学学。最近学习了JSP JDBC Servlet 架构好Tomcat服务器,也算学到了不少知识,但是我觉得我的基础还是很薄弱,还需要对JavaSE知识总结,今天我想学一下List。
List的用法:List包括List接口的实现类。List继承了Collection接口,所以List接口拥有Collection接口提供的常用方法,List是列表类
型,所以List接口还提供了一些适合于自身的方法。具体的方法还是看JDK比较好。List提供的适合自身的方法均和索引有关系,因为List集合为列表类型,以线性方式存储对象,可以通过对象的索引来操作对象。
List接口常用实现类有ArrayList和LinkedList,在使用List集合时,通常生命为List类型,实例化时根据需要选择ArrayList还是LinkedList。
举个栗子:
List<String> list1 = new ArrayList<>();//ArrayList实例化List集合 List<String> list2 = new LinkedList<>();//LinkedList实例化List集合
1、add(int index,Object obj)和 set(int index,Object obj)方法的区别
前者是指定索引位置添加对象,后者是修改索引位置的对象。
看一段代码:
1 package cn.zpoor.ListTest; 2 3 import java.util.Iterator; 4 import java.util.LinkedList; 5 import java.util.List; 6 7 /** 8 * 比较List中的add和set方法*/ 9 public class SetAndAddTestList { 10 public static void main(String[] args) { 11 String a = "A"; 12 String b = "B"; 13 String c = "C"; 14 String d = "D"; 15 String e = "E"; 16 17 List<String> list = new LinkedList<>(); 18 list.add(a); 19 list.add(e); 20 list.add(d); 21 list.set(1, b);//将索引为1的对象e修改为对象b 22 list.add(2, c);//将对象c添加到索引位置为2的位置 23 24 Iterator<String> iterator = list.iterator(); 25 26 while(iterator.hasNext()) { 27 System.out.println(iterator.next()); 28 } 29 System.out.println(list.size());//输出list的长度 30 } 31 } 32 /* 33 结果: 34 A 35 B 36 C 37 D 38 4 39 */
当然,List集合可以通过索引位置来访问对象,所以还可以用for循环来遍历List集合。
举个栗子:
1 package cn.zpoor.ListTest; 2 3 import java.util.LinkedList; 4 import java.util.List; 5 6 /** 7 * 通过索引来遍历List集合*/ 8 public class Listget { 9 public static void main(String[] args) { 10 String a = "A"; 11 String b = "B"; 12 String c = "C"; 13 String d = "D"; 14 String e = "E"; 15 16 List<String> list = new LinkedList<>(); 17 list.add(a); 18 list.add(e); 19 list.add(d); 20 list.set(1, b);//将索引为1的对象e修改为对象b 21 list.add(2, c);//将对象c添加到索引位置为2的位置 22 23 for(int i = 0;i<list.size();i++) { 24 System.out.println(list.get(i)); 25 } 26 } 27 } 28 29 /*结果: 30 * A 31 B 32 C 33 D 34 35 * */
2、indexOf(Object obj)和 lastIndexOf(Object obj)的区别
前者是获得指定的对象的最小的索引位置,后者是获得对象的索引位置最大的索引位置。前提条件是指定的对象在List集合中有重复的元素,如果在List集合中只有一个对象,通过这两个方法得到的索引位置是相同的。
看一段代码:
1 package cn.zpoor.ListTest; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 /* 7 * 比较indexOf和lastIndexOf方法的区别*/ 8 public class ListIndexOf { 9 public static void main(String[] args) { 10 String a = "A"; 11 String b = "B"; 12 String c = "C"; 13 String d = "D"; 14 String zpoor= "zpoor"; 15 16 List<String> list = new ArrayList<>(); 17 list.add(a);//所因为位置0-6 18 list.add(zpoor); 19 list.add(b); 20 list.add(zpoor); 21 list.add(c); 22 list.add(zpoor); 23 list.add(d); 24 25 System.out.println(list.indexOf(zpoor));//输出zpoor对象的最小索引 26 System.out.println(list.lastIndexOf(zpoor));//输出zpoor对象的最大索引 27 System.out.println(list.indexOf(b));//输出对象b的最小索引 28 System.out.println(list.lastIndexOf(b));//输出对象b的最大索引 最大和最小其实是相同的 29 } 30 } 31 32 /* 33 结果: 34 * 1 35 5 36 2 37 2 38 */
3、subList(int fromIndex,int toIndex)方法使用说明
subList就是指定截取一段List集合中的对象生成新的List集合,新的对象包含起始索引,但是不包括终止索引,就是左闭右开,[ )
看一段代码:
1 package cn.zpoor.ListTest; 2 3 import java.util.LinkedList; 4 import java.util.List; 5 6 /* 7 * 演示subList的使用方法*/ 8 public class SubList { 9 public static void main(String[] args) { 10 String a = "A"; 11 String b = "B";//1 12 String c = "C";//2 13 String d = "D";//3 14 String e = "E"; 15 16 List<String> list = new LinkedList<>(); 17 list.add(a); 18 list.add(b); 19 list.add(c); 20 list.add(d); 21 list.add(e); 22 list = list.subList(1, 3);//截取索引位置为1-3(包括1,不包括3) 23 for(String x:list) { 24 System.out.println(x);//输出List集合 25 } 26 } 27 } 28 29 /* 30 * 结果: 31 * B 32 C 33 */
4、ArrayList 和 LinkedList之间的区别(重点)
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
ArrayList和LinkedList在性能上各有优缺点,都有各自所适用的地方,总的说来可以描述如下:
1.对ArrayList和LinkedList而言,在列表末尾增加一个元素所花的开销都是固定的。对ArrayList而言,主要是在内部数组中增加一项,指向所添加的元素,偶 尔可能会导致对数组重新进行分配;而对LinkedList而言,这个开销是统一的,分配一个内部Entry对象。
2.在ArrayList的中间插入或删除一个元素意味着这个列表中剩余的元素都会被移动;而在LinkedList的中间插入或删除一个元素的开销是固定的。
3.LinkedList不支持高效的随机元素访问。
4.ArrayList的空间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间
可以这样说:当操作是在一列数据的后面添加数据而不是在前面或中间,并且需要随机地访问其中的元素时,使用ArrayList会提供比较好的性能;当你的操作是在一列数据的前面或中间添加或删除数据,并且按照顺序访问其中的元素时,就应该使用LinkedList了。(摘自一个技术博客,谢谢他)