JAVA基礎複習十五-Collection集合子類-List集合的子類
阿新 • • 發佈:2019-02-18
一、陣列與集合
* 陣列和集合儲存引用資料型別,存的都是地址值
二、集合的由來及集合繼承體系圖
* A:集合的由來 * 陣列長度是固定,當新增的元素超過了陣列的長度時需要對陣列重新定義,太麻煩,java內部給我們提供了集合類,能儲存任意物件,長度是可以改變的,隨著元素的增加而增加,隨著元素的減少而減少 * B:陣列和集合的區別 * 區別1 : * 陣列既可以儲存基本資料型別,又可以儲存引用資料型別,基本資料型別儲存的是值,引用資料型別儲存的是地址值 * 集合只能儲存引用資料型別(物件)集合中也可以儲存基本資料型別,但是其實是在儲存的時候會自動裝箱變成物件 * 區別2: * 陣列長度是固定的,不能自動增長 * 集合的長度的是可變的,可以根據元素的增加而增長,1.5倍增長(部分集合底層也是用陣列來做的) * C:陣列和集合什麼時候用 * 1,如果元素個數是固定的推薦用陣列 * 2,如果元素個數不是固定的推薦用集合
三、Collection集合的基本功能
1.boolean add(E e)E是新增的泛型,表示本集合中只能新增那種型別的元素 add方法如果是list集合,一致返回true,因為list集合中是可以儲存重複元素的,如果是set集合上儲存重複元素的時候,就會返回false arraylist的父類的父類重寫了toString方法 可以新增所有的資料型別 2.boolean remove(Object o)//刪除指定元素 3.void clear()//清空集合 4.boolean contains(Object o)//是否包含 5.boolean isEmpty()//判斷集合是否為空 6.int size()//獲取集合中元素的個數
四、Collection集合的帶All功能
boolean addAll(Collection c)
boolean removeAll(Collection c)//刪除的是交集
boolean containsAll(Collection c)//可以有重複的
boolean retainAll(Collection c)//取交集,並把交集賦值給呼叫者,若交集為空,呼叫者也被賦值為空,值改變了所以返回true,只要呼叫者值改變了就返回true(包括交集為空),否則返回false(呼叫者是被呼叫者的子集)
五、集合的遍歷之迭代器遍歷
* A:迭代器概述 * 集合是用來儲存元素,儲存的元素需要檢視,那麼就需要迭代(遍歷) Iterator it = c.iterator();//獲取迭代器的引用 while(it.hasNext()) { //如果集合中有下一個元素 System.out.println(it.next());取出下一個元素(從0開始) }
六、迭代器的原理及原始碼解析
* A:迭代器原理
* 迭代器原理:迭代器是對集合進行遍歷,而每一個集合內部的儲存結構都是不同的,所以每一個集合存和取都是不一樣,那麼就需要在每一個類中定義hasNext()和next()方法,這樣做是可以的,但是會讓整個集合體系過於臃腫,迭代器是將這樣的方法向上抽取出介面,然後在每個類的內部,定義自己迭代方式,這樣做的好處有二,第一規定了整個集合體系的遍歷方式都是hasNext()和next()方法,第二,程式碼有底層內部實現,使用者不用管怎麼實現的,會用即可
*比如ArrayList有自己特有的迭代器ListIterator
七、List集合的特有功能
* A:List集合的特有功能概述
* void add(int index,E element)
* E remove(int index)只能刪除索引,因為不會自動裝箱,否則就亂了。比如說集合中有一個元素是1,那麼remove(1)是刪除1這個元素,還是1這個索引位置的元素呢。所以不自動裝箱,就刪除索引位置對應的元素,下同
* E get(int index)
* E set(int index,E element)
*
八、集合遍歷中的併發修改異常產生的原因及解決方案
* A:需求:我有一個集合,請問,我想判斷裡面有沒有"world"這個元素,如果有,我就新增一個"javaee"元素,請寫程式碼實現。
List list = new ArrayList();
list.add("a");
list.add("b");
list.add("world");
list.add("d");
list.add("e");
Iterator it = list.iterator();
while(it.hasNext()) {
String str = (String)it.next();
if(str.equals("world")) {
list.add("javaee"); //這裡會丟擲ConcurrentModificationException併發修改異常,遍歷的同時增刪元素,引起併發修改異常。因為集合在用迭代器之前就已經告訴它自己有多少個元素了,迭代器就按這麼多元素去迭代,結果在迭代途中增刪元素,迭代器就受不了了。
}
}
* B:解決方案
* a:迭代器迭代元素,用特有的迭代器修改元素(ListIterator的特有功能add)
* b:集合遍歷元素,集合修改元素
ListIterator lit = list.listIterator(); //如果想在遍歷的過程中新增元素,可以用ListIterator中的add方法
while(lit.hasNext()) {
String str = (String)lit.next();
if(str.equals("world")) {
lit.add("javaee");
//list.add("javaee");
}
}
九、ListIterator
* boolean hasNext()是否有下一個
* boolean hasPrevious()是否有前一個
* Object next()返回下一個元素
* Object previous();返回上一個元素
十、Vector,已經被淘汰
* A:Vector類概述
* Vector是JDK1.0出來的,從JDK1.2之後出現Collection集合,其中的ArrayList代替了Vector的功能,就把它放在了List集合的下面。它是執行緒安全的所以相比較ArrayList效率低,底層也是用陣列實現的。
* B:Vector類特有功能
* public void addElement(E obj)
* public E elementAt(int index)
* public Enumeration elements()
* C:案例演示
* Vector的迭代
Vector v = new Vector(); //建立集合物件,List的子類
v.addElement("a");
v.addElement("b");
v.addElement("c");
v.addElement("d");
//Vector迭代
Enumeration en = v.elements(); //獲取列舉
while(en.hasMoreElements()) { //判斷集合中是否有元素
System.out.println(en.nextElement());//獲取集合中的元素
}
十一、資料結構之陣列和連結串列
* A:陣列
* 查詢快修改也快(給相應索引,就直接給到相應所以對應的值,所以查詢快,找到了才能修改,所以修改也快)
* 增刪慢(陣列增加一個元素,是把想要增加元素的索引位置後面的的所有元素全部複製,向後移動一位,再把增加的元素增加進去。刪除一個元素就是把後面所有的元素複製,向前覆蓋,再把最後一個元素置空,所以增刪很費事,慢)
* B:連結串列
* 查詢慢,修改也慢(先判斷要查詢的索引在中間位置的左邊還是右邊,在左邊就從頭一個一個向後查詢,在右邊就從最後一個物件向前一個一個查詢,所以查詢慢,查到了才能修改,自然修改也慢)
* 增刪快(連結串列結構中,每個物件只需要記住自己前面和後面物件即可,所以增加一個元素,只需要破壞增加位置的原來兩個元素的連結,增加進去就可以了,刪除也是一樣,所以快。)
十二、List的三個子類的特點
ArrayList:
底層資料結構是陣列,查詢快,增刪慢。
執行緒不安全,效率高。
Vector:
底層資料結構是陣列,查詢快,增刪慢。
執行緒安全,效率低。
Vector相對ArrayList查詢慢(執行緒安全的)
Vector相對LinkedList增刪慢(陣列結構)
LinkedList:
底層資料結構是連結串列,查詢慢,增刪快。
執行緒不安全,效率高。
Vector和ArrayList的區別
Vector是執行緒安全的,效率低
ArrayList是執行緒不安全的,效率高
共同點:底層都是陣列實現的
ArrayList和LinkedList的區別
ArrayList底層是陣列結構,查詢和修改快
LinkedList底層是連結串列結構的,增和刪比較快,查詢和修改比較慢
共同點:都是執行緒不安全的
* B:List有三個兒子,我們到底使用誰呢?
查詢修改多用ArrayList
增刪多用LinkedList
如果都多ArrayList