Java容器深入淺出之Collection與Iterator介面
Java中用於儲存物件的容器,除了陣列,就是Collection和Map介面下的容器實現類了,包括用於迭代容器中物件的Iterator介面,構成了Java資料結構主體的集合體系。其中包括:
1. Collection:包括Set、List和Queue;主要的實現類有HashSet、TreeSet、ArrayList、LinkedList和ArrayDeque
2. Map:主要的實現類為HashMap、TreeMap
3. Iterator: 用於遍歷集合中的物件
Collection
Collection介面中定義了Set、List和Queue都會用到的方法,包括:
1. 增
boolean add(Object o)
boolean addAll(Collection c)
2. 刪
boolean remove(Object o): 刪除物件o,只刪除第一個符合的物件,成功返回true
boolean removeAll(Collection c):刪除集合c包含的所有元素,
boolean removeIf(Predicate<? super E> filter):Java8增強的條件查詢,傳入函式式Predicate物件filter進行條件刪除
boolean retainAll(Collection c):刪除c中不包含的元素,相當於取交集
void clear():清除所有元素,長度歸0
3. 查
int size()
boolean isEmpty()
boolean contains(Object o):是否包含元素o
boolean containsAll(Collection c):是否包含集合c的所有元素
4. 改
Object toArray():集合變為陣列
5. 其它
Iterator iterator():返回一個Iterator物件,用於遍歷集合元素
Iterator
Iterator是Java集合的介面成員,提供遍歷集合物件的方法。定義瞭如下4個方法:
1. boolean hasNext():判斷是否遍歷完成
2. Object next():返回下一個元素
3. void remove():刪除上一次next返回的元素
4. void forEachRemaining(Consumer action):Java8新增的Lambda遍歷方法
要注意的是:
1. Iterator物件通過集合呼叫Iterator方法生成。
2. Iterator遍歷集合元素時(包括增強for迴圈),是通過值傳遞來獲取元素的值,因此在迭代中修改元素的值將不起作用。
3. Iterator只能通過自身的remove方法刪除物件,而不能呼叫集合自身的remove方法,否則會導致ConcurrentModificationException異常。
4. Iterator物件的遍歷方法,無論是常規的while迴圈,還是Java8新增的forEachRemaining方法,只能在一個方法中遍歷一次集合。(原因在於底層都是通過Next來返回集合元素,在第一輪中已經Next完集合所有元素了,所以再起一輪遍歷,hasNext將為false;相反,集合的forEach方法,則可以多輪遍歷)
public class IteratorTest { public static void main(String[] args) { Set<String> books = new HashSet<String>(); books.add("1844年經濟學哲學手稿"); books.add("德謨克利特的自然哲學和伊壁鳩魯的自然哲學的差別"); books.add("資本論"); books.add("自然辯證法"); books.add("1"); //Java8的增強條件刪除,需要傳入函式式條件 books.removeIf(ele -> ele.length() < 3); Iterator<String> it = books.iterator(); //使用Lambda表示式遍歷集合(Iterator物件) //it.forEachRemaining(obj -> System.out.println("Iterator遍歷物件:" + obj)); while(it.hasNext()) { String book = it.next(); System.out.println(book); if(book.equals("資本論")) { it.remove(); } book = "通往奴役之路";//Iterator不能改變集合元素,賦值失敗 } System.out.println(books); //使用Lambda表示式遍歷集合(集合物件) books.forEach(obj -> System.out.println("集合遍歷物件:" + obj)); } }