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接口.那麽共有的方法就是增刪改查. 除非使用單獨的類. 我們可以具體查詢方法.
Java開發知識之Java中的集合上List接口以及子類講解.