深入Collection集合的子介面List
阿新 • • 發佈:2019-01-01
今天來理順一下Java裡面的Collection集合以及裡面的子集合,請看下面這張圖片:
Collectio集合有兩個子介面:List和Set
List的特點:元素是有序的,元素可以重複,因為該集合體繫有索引
Set的特點:元素是無序的,元素不能重複
List集合底下的三個子介面;
ArrayList:底層使用的是陣列結構,特點:查詢速度很快,還有修改,但是增刪稍慢,執行緒不同步
LinkedList:底層使用的是連結串列結構 特點:增刪速度很快,查詢速度稍慢
Vector:底層是陣列資料結構,執行緒同步,無論增刪,還是查詢效率都慢,被ArrayList取代了
先來說一下List集合的公共方法:
增:add(index,element);
刪:remove(index);
改:set(index,element);
查:get(index); && subList(from,to); && listIterator();
其中listIterator是List特有的迭代器,ListIterator是Iterator的子介面。在迭代時,不能通過集合物件的方法操作集合中的元素,因為會產生ConcurrentModificationException異常,所以在迭代時只能用迭代器的方法去操作元素,可是Iterator的方法是有限的,只能進行元素的查詢,刪除,判斷操作,如果想要 其他的操作。如新增,修改,就需要使用其子介面:ListIterator。該介面只能通過List集合的listIterator方法獲取。
分別說一下三個子介面:
ArrayList介面的相關程式碼:
import java.util.*; public class Test01{ public static void main(String[] args){ method_get(); } public static void sop(Object obj){ System.out.println(obj); } public static void base_method(){ ArrayList a = new ArrayList(); //新增 a.add("a"); a.add("b"); a.add("c"); a.add("d"); //獲取元素個數 sop(a.size()); //列印集合 sop(a); //刪除元素 a.remove("a"); sop(a); //判斷元素 sop(a.contains("b")); //清空集合 //a.clear(); //集合是否為空 sop(a.isEmpty()); } public static void method_2(){ ArrayList a1 = new ArrayList(); a1.add("1"); a1.add("2"); a1.add("3"); a1.add("4"); ArrayList a2 = new ArrayList(); a2.add("3"); a2.add("4"); a2.add("5"); a2.add("6"); //a1.retainAll(a2);//取交集 a1.removeAll(a2);//去掉和a2中相同的元素 sop(a1); sop(a2); } /* 什麼是迭代器: 是用於取出集合中元素的一種方式 */ public static void method_get(){ ArrayList a1 = new ArrayList(); a1.add("java01"); a1.add("java02"); a1.add("java03"); a1.add("java04"); Iterator it = a1.iterator();//獲取迭代器,用於取出集合中的元素 /* sop(it.hasNext());//有元素返回的是true,沒有元素返回的是false sop(it.next()); sop(it.next()); sop(it.next()); sop(it.next()); */ while(it.hasNext()){ sop(it.next()); } } }
LinkedList介面的相關程式碼:
/*
使用linkedlist模擬一個堆疊和佇列的資料結構
堆疊:先進先出,如同一個杯子
佇列:先進後出,如同一個水管
*/
import java.util.*;
public class linkedlist2{
public static void main(String[] args){
DuiLie li = new DuiLie();
li.myAdd("java01");
li.myAdd("java02");
li.myAdd("java03");
li.myAdd("java04");
while(!li.isNull()){
System.out.println(li.myGet());
}
}
}
class DuiLie{
private LinkedList link;
public DuiLie(){//一初始化就建立物件
link = new LinkedList();
}
public void myAdd(Object obj){
link.addFirst(obj);
}
public Object myGet(){
return link.removeFirst();
}
public boolean isNull(){
return link.isEmpty();
}
}
Vector的相關程式碼:
import java.util.*;
/*
列舉就是Vector特有取出方式
發現列舉和迭代器很像:其實列舉和迭代是一樣的
因為列舉的名稱和其方法的名稱都過長了,所以被迭代給取代了
*/
public class Vector{
public static void main(String[] args){
Vector v = new Vector();
v.add("java01");
v.add("java02");
v.add("java03");
v.add("java04");
Enumeration en = v.elements();
while(en.hasMoreElements()){
System.out.println(en.nextElements());
}
}
}