嗨~ 今天的你過得還好嗎?
路途漫漫終有一歸,
幸與不幸都有盡頭。
在上篇文章中,我們簡單介紹了下Java 集合家族中的成員,那麼本篇文章,我們就來看看 Java在單列集合中,為我們提供的一些方法,以及單列集合的常用遍歷玩法,一起來進入學習吧。
在Java基礎中我們也學過,在類實現介面後,該類就會將介面中的抽象方法繼承過來,此時該類需要重寫該抽象方法,完成具體的邏輯。
Collection 是所有單列集合的父介面,因此在Collection 中定義了單列集合(List 和 Set)通用的一些方法,這些方法可用於操作所有的單列集合。
開啟api檔案,我們可以看到Collection 在 java.util 下,我們通過練習來演示下這些方法的使用:
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學習。
在程式開發中,經常需要遍歷集合中的所有元素,就是要看看裡面所有的元素,那我們怎麼辦呢?
針對這種需求,JDK 專門提供了一個介面: java.util.Iterator。該介面也是 Java集合中的一員,但它與 Collection、Map 介面有所不同,Collection 介面 與 Map 介面 主要用於儲存元素,而 Iterator 主要用於迭代存取(即 遍歷) Collection中的元素,因為Iterator 物件也被稱為迭代器。
下面介紹一下迭代器的概念:
迭代即Collection集合元素的通用獲取方式。在取元素之前先要判斷集合中有沒有元素,如果有,就把這個元素取出來,繼續再判斷,如果還有就再取出來。一直把集合中的所有元素全部取出。這種方式專業術語稱為迭代。
通過檔案,我們可以看到 Iterator 是一個介面,我們無法直接使用,而需要使用Iterator介面的實現類物件,通過Collection介面中的 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 沒有集合元素的錯誤。
我們在之前的案例中已經完成了Iterator 遍歷集合的整個過程。當遍歷集合時,首先通過呼叫集合的iterator() 方法獲得迭代器物件,然後使用hasNext()方法判斷集合中是否存在下一個元素,如果存在,則呼叫next()方法將元素取出,否則說明已經到達集合末尾,停止遍歷元素。
Itearator 迭代器物件在遍歷集合時,內部採用指標的方式來跟蹤集合中的元素,為了讓初學者能更好的理解迭代器的工作原理,接下來通過一個圖例來演示 Iterator 物件迭代元素的過程:
在獲取迭代器的實現類物件是,會把索引指向集合的-1位置,也就是在呼叫Iterator的next方法之前,迭代器的索引位於第一個元素之前,不指向任何元素。
當第一次呼叫迭代器的next方法後,迭代器的索引會向後移動一位,指向第一個元素並將該元素返回,
當再次呼叫next方法時,迭代器的索引會指向第二個元素並將該元素返回,
以此類推,直到hasNext方法返回false,表示到達了集合的末尾,終止對元素的遍歷。
增強for迴圈(也稱為 for each 迴圈)是JDK5以後出來的一個高階for迴圈,專門用來遍歷陣列和集合的。 通過api檔案,Collection 繼承了一個Iterable 介面 ,而實現這個介面允許物件成為 「foreach」 語句目標,也就是所有的單列集合都可以使用增強for。
它的內部原理其實是個Iterator 迭代器,只是用for迴圈的方式來簡化迭代器的寫法,所以在遍歷的過程中,不能對集合中的元素進行增刪改查操作。
格式:
for (元素型別 元素名 : 集合名或陣列) {
存取元素
}
它用於遍歷 Collection 和陣列。通常只進行遍歷元素,不在遍歷的過程中對集合元素進行增刪操作。
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));
}
}
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,本文就到這裡了。