Java開發知識之Java中的集合上List介面以及子類講解.
Java開發知識之Java中的集合類
一丶什麼是集合類
如果你學習說資料結構,那麼學習集合就很簡單. 因為集合就是儲存資料的結構. 例如 有連結串列結構 (list ) 還有 map結構.等等.
集合類就是儲存資料的集合.
我們可以看一下繼承圖:
Collection介面. 由 Set類.以及 List類就行實現. 並且還有子類.
Map 有 HashMap類. 還有 TreeMap類繼承. 各個類都是不一樣的.比如 List.代表連結串列類.可以儲存資料,是連續的.只要有前驅後繼即可. 子類就是對連結串列進行了限制而已.
二丶Collection介面
每次學習一個類的時候.都要從它的頂層開始學習.比如我們學習list類.那麼首先就要看他的父類.父類是否還有父類.因為公共父類是Object,所以我們就不介紹了.直接介紹Conllection介面
這個介面.是層級結構中的根介面. 構成Collection的單位稱為元素.Collection通常是不能直接使用的.但是這個介面提供了 新增元素. 刪除元素. 管理資料的方法. List 跟 Set介面.都繼承了Collection介面.所以她們也都預設有這些方法.
Collection中的介面方法
集合中的元素遍歷就是用迭代器進行遍歷. iterator. 其實如果學習C++.我們可以知道.其實迭代器就是內部類.對其隱藏了實現方法.
遍歷程式碼如下:
public static void main(String[] args) throws MyException { Collection<String> a = new ArrayList<String>(); a.add("1"); a.add("2"); a.add("3"); a.add("2"); a.add("2"); a.add("2"); //進行遍歷ShowPrint(a); } private static void ShowPrint(Collection<String> a) { java.util.Iterator <String> it = a.iterator(); while( it.hasNext()) { System.out.println(it.next()); } }
在這裡遍歷的時候需要注意的問題:
1.呼叫集合的迭代方法的時候.會返回一個迭代類的物件. 也就是Iterator
2.迭代類中提供了三個方法. hasNext() it.next() it.remove
分別是判斷是否有元素.
取下一個元素.
刪除元素.
我們需要注意的是,在遍歷的時候. 首先要呼叫hasNext() 判斷當前是否有元素. .還要呼叫的就是 next 指向下一個元素. it.next兩個作用. 第一個,指向下一個元素. 第二個. 返回上一個元素的值.
it.next返回的物件是 Object物件. 我們可以進行強轉. 如果是用泛型就是指定了.可能返回物件就是你的泛型物件.
三丶List介面
從上面的類的繼承圖可以看到. List介面實現了Collection介面. 所以List介面中 包含了Collection介面的方法. 但是List介面還提供了兩個重要的方法.
get(int index): 獲取指定索引位置的元素
set(int index,Object obj); 將集合中指定索引位置的物件修改為指定的物件.
提供了Set get方法.
因為添加了兩個重要方法.所以List介面有兩個類實現了它.分別有不同的作用
ArrayList類: 這個類就是可變的陣列. 我們定義的陣列都是死的.new多大就是多大.它是可以變得. 跟陣列一樣用.就是可以自動變.我們自己也可以封裝.在C++中就是STL的 vcteor.
作用: 可以進行快速的隨機訪問. 缺點就是向指定索引位置插入或者刪除物件慢. 原因:
如果學過C++ 並且自己封裝就知道.其實當你資料超過陣列最大位置的時候.而是釋放這塊記憶體.重新申請一塊大記憶體.並且拷貝原有資料. 然後插入到指定位置的時候.,還需要遍歷陣列. 移動元素. 所以底層做了很多.所以這就是慢的原因.
LinkedList類: 這個類就是我們傳統意義上的連結串列的. 連結串列我們知道. 插入跟刪除 快. 隨機訪問就慢了.
原因: 陣列有 [] 使用這個給個索引就可以訪問.但是連結串列不可以.連結串列只有遍歷去尋找才可以.所以找的慢. 但是你插入跟刪除快. 因為它斷開連結串列指向下一個就行.
List介面的用法:
通常使用List介面.都是使用例項化類去例項化這個介面.所以一般寫作
list<String> a = new ArrayList<String>(); 當然String我們可以是任意資料型別.合法的就行.我們學過泛型應該知道什麼意思.
list<String> a = new LinkedList<String>();
一般程式碼就是如上.
ArrayList類常用方法
1.增加
不管是ArrayList 以及 LinkedList類. 其實都是管理資料的. 對資料的增刪改查, 既然底層已經使用資料結構的手法給我們封裝好了.所以我們只需要熟悉方法即可.
如果想深入.可以看一下原始碼. 或者學習下資料結構思想. 資料結構很重要的一門課程.
新增方法:
新增方法分別就是 Add() Add(索引.物件) AddAll();
反正萬變不離其宗就是新增.或者給索引我去新增. 等等.
public static void main(String[] args) throws MyException { List<String > a = new ArrayList<>(); Collection<String> b = new ArrayList<>(); b.add("1"); a.add("1"); a.add(0, "2"); a.addAll(b);//新增的是實現了Collection的子類即可. //進行遍歷 ShowPrint(a); } private static void ShowPrint(Collection<String> a) { java.util.Iterator <String> it = a.iterator(); while( it.hasNext()) { System.out.println(it.next()); } }
結果:
List介面的遍歷
for( int i = 0; i < a.size();i++) { System.out.print( " " + a.get(i)); }
list介面因為提供了get方法. 所以我們可以使用 size()獲取集合元素個數. 然後獲取指定元素索引位置的值.
2.刪除
對於ArrayList 類. 它的刪除方法有三個.還有一個單獨的. clean(); 這個方法是清除集合中的所有元素.
1.刪除指定索引位置的值. remove
2.給定一個物件.刪除這個物件則集合中首次出現位置的物件. remove(object o)
3.給定一個範圍.刪除這個範圍內的所有元素. removeRange();
具體不測試了.
3.ArrayList 判斷跟拷貝.
判斷為空
boolean isEmpty(): 為空返回True
Object o clone(); 克隆.拷貝一個Arraylist副本. 使用Object物件接受.我們可以向下轉型.
public boolean contains(Object o); 給定一個元素.判斷這個元素是否則這個集合中.如果有返回true
4.ArrayList的元素查詢.
public int indexOf(Object o); 返回物件首次出現在集合的位置.
public int lastindexof(Object o): 從後往前查詢.找出從後往前第一個出現元素的位置.
LinkedList類
linkedlist類.當做連結串列使用.所以方法都是操作方法的.
如果我們使用 List<E> a = new LinkedList<>(); 這種形式.
我們只需要學習 介面 List跟 LinkedList公共的方法即可.
1.增加:
addFrist();
addLast();
push(E e); 壓入一個元素,其實就是頭部新增元素.
E pop() ;從頭部彈出一個元素.而且這個元素彈出就沒有了.
兩個方法.一個往頭新增元素.一個是尾.
2.迭代
iterator<E> descendingIterator(); 返回尾元素的迭代器.就是從尾巴遍歷.
iterator<E> listIterator(); 返回頭的迭代器.從頭遍歷.
3.獲取
get(int index)
getFirst();
getLast();
E peek(): 獲取頭元素.不移除.
E peekFirst(); 同上
E peekLast(); 獲取尾部元素,不刪除.
分別是獲取指定索引元素
獲取頭元素
獲取尾元素.
4.刪除
Boolean remove(int index);
E removeFrist();
boolean removeLastOcurrence(Object 0); 刪除最後一次出現的指定元素.一般遍歷去做.
E Set(int index,E element); 給一個索引.替換這個索引的物件. 並且返回替換索引的物件.
四丶總結:
1.Collection介面是提供有序的介面
2. Set介面跟list介面分別實現了Collection介面.並且有不同的屬性
3.list介面增加了 E get(int index); 以及 E set(int index,Object o); 兩個方法.
4.迭代
迭代可以使用迭代類. Iterator. List介面實現的子類都有方法iterator返回迭代器
使用方法:
iterator<E> a = xxx.iterator(); while(a.hasNext()){ E e = (e)a.next(); 必須使用next指向下一個元素. }
如果是list可以使用 size() 配合get方法進行遍歷
for(int i = 0; i < a.size();i++){ xxx a = (xxx) a.get(i); ; }
5.ArrayList 類 以及 LinkedList類.
一個類是可變陣列.Arraylist 一個是連結串列 LinkedList. 他們都有不同的方法.
但是如果是實現了List介面.那麼共有的方法就是增刪改查. 除非使用單獨的類. 我們可以具體查詢方法.