標籤:不同 理解 indexof linked rand and 儲存 定義 先後
介面總結UML類圖中的關係
- 依賴 : 局部變數和外部類的關係
- 關聯 : 簡單理解的話就是成員變數
- 彙總:has-a的成員變數,整體與部分分離,有各自獨立的生命週期。eg: 公司&員工,電腦&cpu
- 合成: contains-a關係的成員變數,外部類和內部成員保持同一個生命週期
- 實現 : 實作類別 實現→ 介面 比如Chinese實現Person
- 泛化 : 父類與子類的關係,繼承為其中一種
集合的分類
- 集合主要被分為Collection和Map兩個介面
- Collection被List和Set繼承
- List被AbstractList實現,然後分為ArrayList,LinkedList和Vector
- Set被AbstractSet實現,然後分為HashSet,TreeSet
- Map衍生出HashMap,HashTable和TreeMap
Collection介面Collection介面基本操作
- add()
- addAll()
- clear();
- contains();
- ...
- ...
AbstractCollection實現方法
- contains()
- isEmpty()
- toArray()
- remove()
- clear()
子介面List
一個list是元素有序,可以重複,可以為null的集合
最好做法是: 預設使用ArrayList,多插入刪除時使用LinkedList,Vector太慢避免使用
List實現有序,可重複的原理
- List的資料結構就是一個序列,儲存內容時直接在記憶體中開闢一塊連續空間,然後將空間地址與索引對應
- ArrayList本質為數組
- List元素儲存是互不干擾,所以可以重複(與Set有很大區別)
List介面定義的方法除了Collection內建方法還提供以下的操作:
- 位置相關:比如get,set,add,addAll,remove;
- 搜尋: 從list中尋找元素位置, indexof,lastindexof
- 迭代: 使用Iterator的擴充版迭代器,ListIterator進行迭代操作
- 範圍性操作: subList;
集合操作
public boolean equals(Object o){? retrun this == o;}
- 比較地址是否相等,如果要比較內容,需要重寫.equals().
remove(), contains(), indexof() 都需要用.equals();
public boolean contains(Object object){? Object[] a = array;? int s = size;? if (object!= null){? for (int i =0;i < s; i++){? if(object.equals(a[i])){? return true;? }? }}}
- indexof() 方法差不多,但是要多一個else{} 遍曆Object等於null的情況
位置訪問,搜尋get,set,add,remove
indexOf,lastIndexOf
- 返回指定元素在list中的首次出現,最後一次出現位置(lastIndexOf為倒序遍曆)
addAll(int,Collection)
- 在指定地點插入集合所有元素,元素按照迭代器Iterator返回的先後順序進行插入
簡單List swap()
public static <E> void swap(List<E> a, int i, int j){? E temp = a.get(i);? a.set(i,a.get(j));? a.set(j,temp);}
局部範圍操作
- subList本質為返回原來list的引用,改變了開始位置的offset和size.
return new SubAbstractListRandomAccess<E>(this, start, end);
- 對subList改動同樣會影響原來的list;
List於Array的區別相似之處
不同之處
- 數組可以存任何類型元素
- List不可以存基礎資料型別 (Elementary Data Type),必須封裝
- 數組容量固定, List容量可動態正常
- 數組效率高, List由於需要維護,效率相對低
總結
- 容量固定時先使用數組, 容納類型更多更高效
- 容量不確定的情況下, List更有優勢
List與Array間的轉換
- Object[] toArray(): 返回一個包含List中所有元素的數組
- T[] toArray(T[] array): 作用同上,不同的是,array長度大於List元素是.
會使用參數array儲存List中的元素; 否則會建立一個新的array存放List中元素
迭代器
- List繼承了Collection的iterator()方法,可以擷取Iterator,使用它進行向後遍曆
- 在此基礎上, List還可以擷取更強大的迭代器ListIterator
- ListIterator可以對list進行向前,向後雙向遍曆,同時還允許進行set,add,remove等操作
例子
public int indexOf(E e) { for (ListIterator<E> it = listIterator(); it.hasNext(); ) if (e == null ? it.next() == null : e.equals(it.next())) return it.previousIndex(); // Element not found return -1; }
public static <E> void replace(List<E> list, E val. E newVal){? for(ListIterator<E> it = list.listIterator();it.hasNext();){? if (val == null ? it.next == null ; val.equals(it.next()));? it.set(newVal);? }}
資料結構小節(1)