用了java集合這麼久,還沒有系統的研究過java的集合結構,今天親自畫了下類圖,總算有所收獲。
一、所有集合都實現了Iterable接口。
Iterable接口中包含一個抽象方法:Iterator<T> iterator();每個實現了這個方法的集合都會返回一個Iterator對象。
Iterator:它包含三個方法,hashNext(),next(),remove()三種方法,通過它們可以實現集合的遍歷和元素刪除,例如:
Collection<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String element = iterator.next();
System.out.println(element);//a b c
}
System.out.println(list);//[a, b, c] iterator = list.iterator(); iterator.next();
iterator.remove();
System.out.println(list);//[b, c]
ps:為什麼不直接實現Iterator接口呢?因為:Iterator會攜帶當前集合的位置信息,下次使用再使用的時候就非從0開始了;而Iterable接口每次都返回一個Iterator對象(通過內部類實現Iterator),各個迭代器之間互不影響。
二、ListIterator
從AbstractList起封裝了public ListIterator<E> listIterator()方法,返回一個ListIterator,它在Iterator的基礎上增加了add(),previous(),hasPrevious()等方法,可以實現雙向遍歷。
AbstractList<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
ListIterator<String> iterator = list.listIterator(3);
while (iterator.hasPrevious()) {
String element = iterator.previous();
System.out.println(element);//c,b,a
}
三、比較
ArrayList:允許存放重復元素,且元素是有序的,隨機訪問比較方便。
LinkedList:鏈表實現,插入和刪除時更優於ArrayList。
HashSet:不允許重復元素且無序(散列函數對元素進行排序,可快速查詢),允許null值。
TreeSet:紅黑樹排序,可進行排序,包含的元素要實現Comparable接口並定義compareTo方法,不允許null值。
HashMap:線程不安全,key和值都允許null,判斷是否包含key要使用containsKey()方法,不允許重復key,hash數組的默認大小是16,而且一定是2的指數,重新計算hash值。
HashTable:線程安全,key和value都不允許出現null值,不允許重復key,數組默認大小是11,增加的方式是 old*2+1,使用包含對象的hash值。
四、Collections和Arrays
Collections:java.util下的一個專用類,它包含有各種有關集合操作的靜態方法,可實現對各種集合的搜索、排序、線程安全化等操作。
Arrays:java.util下的一個專用類,用來操作array ,提供搜索、排序、復制,轉換等靜態方法。
關注老姜談技術,微信號:helojava,或者掃描下面二維碼。
每日一帖,技術雞湯。