1. 程式人生 > >Java容器深入淺出之Collection與Iterator介面

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));
    }

}