1. 程式人生 > >Java開發知識之Java中的集合上List介面以及子類講解.

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介面.那麼共有的方法就是增刪改查. 除非使用單獨的類. 我們可以具體查詢方法.