1. 基本概念
java容器類類庫的用途是“保存對象”,可以分爲Collection和Map兩種體系
1.collection 一個獨立元素的序列,這些元素都服從一條或多條規則。Collection(可以有序/無序,可重複/不可重複 等,具體依據具體的子接口Set,List,Queue等)
- List: 按照插入的順序保存元素,可重複的集合
- ArrayList
- LinkedList - Set元素無序,不可重複的集合
- HashSet 使用相當複雜的方式存儲元素,是最快獲取元素的方式
- TreeSet 按照比較結果的升序保存對象
- LinkedHashSet 按照添加的順序保存對象
- queue按照排隊規則來確定對象產生的順序(通常與它們被插入的順序相同)在一端插入元素,一端刪除元素
2.Map 一組成對的鍵值對對象,允許使用關鍵字查找值。
- HashMap最快的查找技術
- TreeMap 按照比較結果的升序存儲鍵
- LinkedHashMap 按照插入的順序保存鍵,同時保留HashMap的查找速度
collection 方法摘要
boolean add(E e) //確保此collection包含指定的元素
boolean addAll(Collection<? extends E>c) //將指定collection中的所有元素都添加到此collection中
void clear() //移除此collection中的所有元素
boolean contains(Object o)//如果此collection中包含指定元素,則返回true;根據元素所在類的equals()方法進行判斷,如果是自定義對象,重寫equals()方法
boolean containsAll(Collection<?> c)//如果此collection包含指定collection中的所有元素,則返回true;
boolean equals(Object o)//比較此collection與指定對象是否相等
boolean isEmpty() //若爲空,則返回true
boolean remove(Object o)
boolean removeAll(Collection<?> c) //從當前集合中刪除包含在參數中的元素,及差集
boolean retainAll(Collection<?> c)//僅保留此collection中那些也包含在指定collection中的元素;返回結果給當前集合。
Object[] toArray() 將集合轉化爲數組,返回包含此collection中所有元素的數組
<T> T[] toArray(T[] a) //返回包含此collection中所有元素的數組;返回數組的運行時類型與指定數組的運行時類型相同。
List中新增加的方法
void add(int index,Object element)//在指定的索引位置index添加元素element
Object get(int index)//獲取指定索引index的元素
boolean addAll(int index,Collection eles)
Object remove(int index)
Object set(int index,Object element) //設置指定索引位置的元素爲element
List subList(int fromIndex,int toIndex)
int indexOf(Object obj)//返回Obj在集合中首次出現的位置。沒有的話,返回-1
int lastIndexOf(Object obj)//返回obj在集合中最後一次出現的位置。如果沒有的話,返回-1
2. 添加一組元素
public class AddingGroups {
public static void main(String[] args){
//Collection的構造器接受另一個Collection來將自己初始化
//Arrays.aslist()方法接受一個數組或者逗號分隔元素列表,並將其轉換爲一個List
Collection<Integer> collection=
new ArrayList<Integer>(Arrays.asList(1,2,3,4,5));
Integer[] moreInt={6,7,8,9};
//Collection.addAll()只接受另一個Collection對象作爲參數
collection.addAll(Arrays.asList(moreInt));
//Collections.addAll()方法接收一個Collection對象,和數組或用對號分隔的列表,
//將元素添加到Collection中
Collections.addAll(collection, moreInt);
Collections.addAll(collection, 10,11,12,13);
List<Integer> lists=Arrays.asList(14,15,16);
lists.set(0, 10);
//運行時異常,Arrays.asList()的輸出,將其當做list,
//但是在這種情況下,其底層表示是數組,不能改變尺寸的大小
//lists.add(17);
}
}
Arrays.asList()和Collections.addAll()方法使用可變參數列表;
3. Iterator
迭代器是一個對象,遍歷並選擇序列中的對象;常被稱爲“輕量級對象”,創建它的代價小;將遍歷序列的操作與序列底層的結構分離,統一了對容器的訪問方式;java中的Iterator 只能單向移動;迭代器指向的位置是元素之前的位置。
- 使用iterator()要求容器返回一個Iterator;
- next() 獲得序列中的下一個元素;輸出並下移
- hasNext()檢查是否還有元素;
- remove()將迭代器新近返回的元素刪除;
如果只是向前遍歷List,但是並不打算修改List對象本身,foreach語法會更加簡潔;
ListIterator
ListIterator沒有當前元素,它的光標位置始終位於調用previous()所返回的元素和調用next()所返回的元素之間
void add(E e);//將指定的元素插入列表;
boolean hasNext(),正向遍歷列表,若列表迭代器有多個元素,則返回true;
boolean hasPrevious()// 逆向遍歷列表,若列表迭代器存在多個元素,則返回true;
int nextIndex() //返回對 next 的後續調用所返回元素的索引;
E previous() //返回列表的前一個元素
int previousIndex() //返回對previous的後續調用所返回的元素索引;
void remove() //從列表移除由next 或previous返回的最後一個元素;
void set(E e) //用指定元素替換next或previous返回的最後一個元素;
remove()和set(Object) 方法不是根據光標位置定義的,而是根據對調用next()或pervious()所返回的最後一個元素的操作定義的。
兩者區別
- ListIterator實現了Iterator接口,幷包含其他的功能,如:增加元素、替換元素、獲取前一個和後一個元素及索引等
- Iterator可以用來遍歷Set和List集合,ListIterator只能用來遍歷List.
- 都可以實現刪除對象,但是ListIterator藉助set()方法實現對象的修改,Iterator不能修改;
4. LinkedList
LinkedList執行某些操作(List中間的插入和刪除操作)比ArrayList高效;
boolean add(E e) //將指定的元素添加到此列表的結尾
E element() //獲取但不移除此列表的頭
E get(int index) //返回此列表中指定位置處的元素
boolean offer(E e) //將指定元素添加到列表的末尾
E peek() //獲取但不移除列表的頭
E Poll() //獲取並移除此列表的頭
E remove() //獲取並移除此列表的頭(第一個元素)
getFirst()和element() 相同,若List爲空,則拋出NoSuchElementException。 peek()在列表爲空時返回null;
removeFirst和remove() 方法相同,在List爲空時拋出NoSuchElementException。 pool()在列表爲空時返回null;
import java.util.*;
/*
* 創建一個空的LinkedList<Integer>,通過使用ListIterator,
* 將若干個Integer插入到這個list中,總是在中間位置插入
*/
public class E14_MiddleInsertion {
public static void main(String[] args){
LinkedList<Integer> list=new LinkedList<>();
ListIterator<Integer> iterator=list.listIterator();
for(int i=1;i<=10;i++){
iterator.add(i);
if(i%2==0)
iterator.previous();
}
System.out.print(list);
}
}
5. Stack
java.util中沒有任何公共的Stack接口
ArrayList實現自List接口(隊列結構),JDK沒有直接提供Stack結構的接口,JDK的java.util.Stack類是從Vector繼承而來,Vector已過時,主要用於容量增加算法和同步以及方法冗餘,同Stack、HashTable正在被淘汰,更明智的做法是用LinkedList取代Stack。
import java.util.LinkedList;
public class Stack<T> {
private LinkedList<T> storage=new LinkedList<T>();
public void push(T t){storage.addFirst(t);}
public T peek(){return storage.getFirst();}
public T pop(){return storage.removeFirst();}
public boolean empty(){return storage.isEmpty();}
public String toString(){return storage.toString();}
}
6. Set
不保存重複的元素,常用來查詢某個元素是否在set中
SortedSet 是一個接口,元素按照自然順序進行排序,或者根據在創建有序set時提供的Comparator進行排序。插入有序set的所有元素必須實現Comparable接口(或者被指定的比較器接受),並且,所有的這些元素都是可以相互比較的。
所有通用有序set實現類都應該提供4個“標準”構造方法:
1. void構造方法,創建一個空的有序set, 按照元素的自然順序進行排序;
2. 帶有一個Comparator類型參數的構造方法,它創建一個空的有序set,根據指定的比較器進行排序;
3. 帶有一個Collection類型參數的構造方法,創建一個新的有序set, 其元素與參數相同,按照元素的自然順序進行排序;
4. 帶有一個SortedSet類型參數的構造函數,創建一個新的有序set,其元素和排序方法與輸入的有序set相同,無法保證強制實施此建議,因爲接口不能包含構造方法;
HashSet : 通過使用散列法來存儲信息,元素並沒有以某種特定的順序存放;
LinkedHashSet: 使用鏈表來維護元素的插入順序,因爲查詢速度原因也使用了散列;
TreeSet: 元素存儲在紅黑樹存儲結構中,對象以升序存儲,訪問和遍歷的時間很快;