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

Java開發知識之Java中的集合上List接口以及子類講解.

必須 元素 範圍 指向 指定 pub next 自己 什麽

            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接口以及子類講解.