說實話,最近的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了。(摘自一個技術博客,謝謝他)
