【Java集合】單列集合Collection常用方法詳解

雲端源想發表於2023-10-31


嗨~ 今天的你過得還好嗎?

路途漫漫終有一歸,

幸與不幸都有盡頭。

在上篇文章中,我們簡單介紹了下Java 集合家族中的成員,那麼本篇文章,我們就來看看 Java在單列集合中,為我們提供的一些方法,以及單列集合的常用遍歷玩法,一起來進入學習吧。

在Java基礎中我們也學過,在類實現介面後,該類就會將介面中的抽象方法繼承過來,此時該類需要重寫該抽象方法,完成具體的邏輯。

一、Collection 常用功能

Collection 是所有單列集合的父介面,因此在Collection 中定義了單列集合(List 和 Set)通用的一些方法,這些方法可用於操作所有的單列集合。

1.1 方法如下:


開啟api文件,我們可以看到Collection 在 java.util 下,我們透過練習來演示下這些方法的使用:

1.2 方法演示:

public class Demo1Collection {    
        public static void main(String[] args) {
            //建立集合物件
            //使用多型的形式 定義
            Collection<String> person = new ArrayList<>();
            //輸出不是一個物件地址,所以說重寫了toString 方法
            System.out.println(person);
                
    //        boolean add(Object o)  向集合中新增一個元素
    //        返回值是一個boolean值,一般可以不用接收
            person.add("科比");
            person.add("姚明");
            person.add("庫裡");
            person.add("麥迪");
            //新增完我們在輸出一下這個集合
            System.out.println(person);
    //        boolean remove(Object o)  刪除該集合中指定的元素
    //        返回 集合中存在元素,刪除元素,返回true;集合中不存在,刪除返回false
            boolean res1 = person.remove("科比");
            boolean res2 = person.remove("奧尼爾");
            System.out.println("res1=" +res1);
            System.out.println("res2=" +res2);
    //        boolean isEmpty()  判斷該集合是否為空
            boolean empty = person.isEmpty();
            System.out.println("empty=" + empty);
                
    //        boolean contains(Object o)  判斷該集合中是否包含某個元素
            boolean contains = person.contains("麥迪");
            System.out.println("contains=" + contains);
    //        int size()  獲取該集合元素個數
            int size = person.size();
            System.out.println("size = " + size);
                
    //        public Object[] toArray()  把集合總的元素,儲存到陣列中
            Object[] personArray = person.toArray();
            for (int i = 0; i < personArray.length; i++) {
                System.out.println("陣列--" + personArray[i]);
            }
                
    //        void clear()  刪除該集合中的所有元素,但是集合還存在
            person.clear();
            System.out.println(person);    
    
            //透過多型的方式,如果我們把arrayList 換成HashSet,發現也能使用,這就是我們實現介面的好處
        }
    }

注意:有關Collection中的方法不止上面這些,其他方法可以自行檢視API學習。

二、查詢集合中的元素-Iterator 迭代器

2.1 Iterator 介面

在程式開發中,經常需要遍歷集合中的所有元素,就是要看看裡面所有的元素,那我們怎麼辦呢?

針對這種需求,JDK 專門提供了一個介面: java.util.Iterator。該介面也是 Java集合中的一員,但它與 Collection、Map 介面有所不同,Collection 介面 與 Map 介面 主要用於儲存元素,而 Iterator 主要用於迭代訪問(即 遍歷) Collection中的元素,因為Iterator 物件也被稱為迭代器。

下面介紹一下迭代器的概念:

迭代即Collection集合元素的通用獲取方式。在取元素之前先要判斷集合中有沒有元素,如果有,就把這個元素取出來,繼續再判斷,如果還有就再取出來。一直把集合中的所有元素全部取出。這種方式專業術語稱為迭代。
透過文件,我們可以看到 Iterator 是一個介面,我們無法直接使用,而需要使用Iterator介面的實現類物件,透過Collection介面中的 Iterator()方法,就可以返回迭代器的實現類物件:

  • public Iterator iterator(): 獲取結合對應的迭代器,用來遍歷集合中的元素。

透過API文件,我們可以看到 Collection 中 Itrerator 介面的常用方法如下:

  • public E next() 返回迭代的下一個元素

  • public boolean hasNext() 如果仍有元素可以迭代,則返回true


接下來我們透過案例學習,如何使用Iterator 迭代集合中的元素:

/**
     *  Iterator 迭代器使用
     */
    public class Demo1Iterator {    
        public static void main(String[] args) {            
            /**
             * 使用步驟:
             * 1. 使用集合中的方法 iterator() 獲取迭代器的實現類物件,使用Iterator介面接收 (使用介面接收返回值,這就是我們說的多型)
             * 2. 使用Iterator介面中的方法 hashNext() 判斷有沒有下一個元素
             * 3. 使用Iterator介面中的方法 next() 取出集合中的下一個元素
             *
             */
            Collection<String> ball = new ArrayList<>();
            ball.add("籃球");
            ball.add("足球");
            ball.add("排球");
            ball.add("乒乓球");    
            //我們來獲取一個迭代器,多型
            Iterator<String> iterator = ball.iterator();    
            //判斷
            boolean b = iterator.hasNext();
            System.out.println("是否有元素--" + b);
            //取出
            String next = iterator.next();
            System.out.println("元素--" + next);    
            //判斷
            boolean b1 = iterator.hasNext();
            System.out.println("是否有元素--" + b1);            
            //取出
            String next1 = iterator.next();
            System.out.println("元素--" + next1);    
            //判斷
            boolean b2 = iterator.hasNext();
            System.out.println("是否有元素--" + b2);            
            //取出
            String next2 = iterator.next();
            System.out.println("元素--" + next2);    
            //判斷
            boolean b3 = iterator.hasNext();
            System.out.println("是否有元素--" + b3);            
            //取出
            String next3 = iterator.next();
            System.out.println("元素--" + next3);    
            //判斷
            boolean b4 = iterator.hasNext();
            System.out.println("是否有元素--" + b4);            
            //取出
    //        String next4 = iterator.next();
    //        System.out.println("元素--" + next4);
            //如果沒有元素,在取的話,會報一個NoSuchElementException 的錯誤
    
    
            /**
             *
             * 程式碼最佳化 上面這些步驟是一個重複的過程,我們可以使用迴圈來最佳化,那我們選擇哪種來呢
             * 我們說 知道元素個數,使用for
             * 不知道元素個數,使用while
             *
             * 那當前我們迭代器的個數,我們不知道,所以使用while迴圈,而我們的hasNext 就可以作為
             * while的條件來判斷
             *
             */
            while (iterator.hasNext()) {
                String ballResult = iterator.next();
                System.out.println("--最佳化--" + ballResult);
            }
    
        }
    }

分析:

在進行集合元素取出時,如果集合中已經沒有元素了,還繼續使用迭代器的next方法,將會發生java.util.NoSuchElementException 沒有集合元素的錯誤。

2.2 迭代器的實現原理

我們在之前的案例中已經完成了Iterator 遍歷集合的整個過程。當遍歷集合時,首先透過呼叫集合的iterator() 方法獲得迭代器物件,然後使用hasNext()方法判斷集合中是否存在下一個元素,如果存在,則呼叫next()方法將元素取出,否則說明已經到達集合末尾,停止遍歷元素。

Itearator 迭代器物件在遍歷集合時,內部採用指標的方式來跟蹤集合中的元素,為了讓初學者能更好的理解迭代器的工作原理,接下來透過一個圖例來演示 Iterator 物件迭代元素的過程:

在獲取迭代器的實現類物件是,會把索引指向集合的-1位置,也就是在呼叫Iterator的next方法之前,迭代器的索引位於第一個元素之前,不指向任何元素。

  • 當第一次呼叫迭代器的next方法後,迭代器的索引會向後移動一位,指向第一個元素並將該元素返回,

  • 當再次呼叫next方法時,迭代器的索引會指向第二個元素並將該元素返回,

  • 以此類推,直到hasNext方法返回false,表示到達了集合的末尾,終止對元素的遍歷。

三、查詢集合中的元素-增強for

3.1 概念

增強for迴圈(也稱為 for each 迴圈)是JDK5以後出來的一個高階for迴圈,專門用來遍歷陣列和集合的。 透過api文件,Collection 繼承了一個Iterable 介面 ,而實現這個介面允許物件成為 “foreach” 語句目標,也就是所有的單列集合都可以使用增強for。

它的內部原理其實是個Iterator 迭代器,只是用for迴圈的方式來簡化迭代器的寫法,所以在遍歷的過程中,不能對集合中的元素進行增刪改查操作。

格式:

for (元素型別 元素名 : 集合名或陣列) {
        訪問元素
    }

它用於遍歷 Collection 和陣列。通常只進行遍歷元素,不在遍歷的過程中對集合元素進行增刪操作。

3.2 練習1:遍歷陣列

public class Demo2Foreach {    
        public static void main(String[] args) {    
            int[] array = {1,2,3,4,5};    
            for (int i : array) {
                System.out.println("--陣列元素--" + i);    
                if (i == 2) {
                    i = 19;
                }
            }    
            //在增強for中修改 元素,並不能賦值
            System.out.println(Arrays.toString(array));
        }
    }

3.3 練習2:遍歷集合

public class Demo3Foreach {    
        public static void main(String[] args) {
            Collection<String> ball = new ArrayList<>();
            ball.add("籃球");
            ball.add("足球");
            ball.add("排球");    
            for (String s : ball) {
                System.out.println("---" + s);
            }    
            //相對於Iterator遍歷方式,增強for 簡化了很多,所以優先使用該方式。
        }
    }

新for 迴圈必須有被遍歷的目標。目標只能是Collection 或者是陣列。僅僅作為遍歷操作出現。

總結

本篇中主要介紹了單列集合介面Collection為我們提供的常用介面,也透過程式碼的方式帶大家體會了一下。在後面的內容中為大家介紹瞭如何把單列集合中的內容檢視出來(遍歷),透過講解一些底層的原理,讓大家感受了一下迭代器的使用。

程式設計學習,從雲端源想開始,課程影片、線上書籍、線上程式設計、一對一諮詢……你想要的全部學習資源這裡都有,重點是統統免費!點這裡即可檢視

當然集合的遍歷不僅僅限於這兩種方式,例如java8為我們提供的流式遍歷集合,希望大家下去後自己也能搜搜相關的遍歷方式,嘗試使用一下,ok,本文就到這裡了。

相關文章