Java基礎之:集合——Collection
為什麼要引入集合的概念?
因為我們在使用陣列時,不方便動態的擴容縮容。而集合很好的解決了這個問題,當然這只是集合強大功能中的一部分。
集合的分類
Collection
首先,學習單列集合Collection。我們先了解什麼是單列,什麼是雙列。
雙列:由兩列資料組成,一列表示鍵,一列表示值。類似二維陣列。
Collection是一個介面,public interface Collection<E> extends Iterable<E>
對於Collection的實現類而言,有些是有序(List)的,有些是無序(Set)的。(這裡的有序與無序指的是,輸出資料時是否按照輸入時的順序)
Set與List是繼承於Collection介面的兩個子介面。可以通過它們來實現Collection。
List是允許有重複元素的,Set是不允許有重複元素的。
Collection常用方法
在Collection介面中的方法,在List與Set中也能夠使用,所以比較重要。
-
add:新增單個元素
-
remove:刪除指定元素
-
contains:查詢元素是否存在
-
size:獲取元素個數
-
isEmpty:判斷是否為空
-
addAll:新增多個元素
-
containsAll:查詢多個元素是否都存在
-
removeAll:刪除多個元素
-
clear:清空
package class_collection; import java.util.ArrayList; import java.util.Collection; public class ClassTest01_CollectionMethods { @SuppressWarnings({ "unchecked", "rawtypes" }) public static void main(String[] args) { //Collection的子介面List的實現類ArrayList,使用多型的特性。 //此時col編譯型別為Collection,執行型別為ArrayList,所以只能訪問Collection中的方法。 Collection col = new ArrayList(); //add:新增單個元素 col.add("Hello" + "01"); col.add("Hello" + "02"); col.add("Hello" + "03"); col.add("Hello" + "04"); System.out.println(col); //remove:刪除指定元素 col.remove("Hello02"); System.out.println(col); //contains:查詢元素是否存在 col.contains("Hello01"); //true //size:獲取元素個數 col.size(); // 3 //isEmpty:判斷是否為空 col.isEmpty(); //false //addAll:新增多個元素,引數為Collection型別,即實現了Collection介面的集合。 col.addAll(col); //此效果等同於將col複製一份加入原來的col集合中 System.out.println(col); //containsAll:查詢多個元素是否都存在,引數為Collection型別 col.containsAll(col); //true //removeAll:刪除多個元素,引數為Collection型別 col.removeAll(col); //效果等同於清空集合 System.out.println(col); //clear:清空 col.clear(); System.out.println(col); } }
Collection遍歷方式
Collection介面可以使用兩種方法遍歷集合,使用Iterator迭代器 或者 使用增強for迴圈。
Iterator迭代器遍歷
Iterator物件稱為迭代器(設計模式的一種),主要用於遍歷Collection集合中的元素。
Collection介面中有iterator()方法,用以返回一個Iterator介面的物件,即可以返回一個迭代器。(Collection中有此方法,那麼所有實現Collection介面的類也可以使用)
Iterator僅用於遍歷集合,Iterator本身並不提供承載物件的能力(它是一個介面)。如果需要建立Iterator物件,則必須要有一個需要被迭代的集合。
迭代器執行原理:
-
建立迭代器 Iterator iterator = col.iterator();
-
使用hasNext()方法判斷是否還有下一個元素:iterator.hasNext(); //T or F
-
使用next()方法將指標下移並返回下移後指標指向的元素:System.out.println(iterator.next());
-
在使用迭代器遍歷完一次集合後,一定要重置迭代器。否則迭代器將一直指向最後一個元素,就不能進行下一次遍歷。
package class_collection; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; public class ClassTest02_ForeachCollection { @SuppressWarnings({ "rawtypes", "unchecked" }) public static void main(String[] args) { Collection col = new ArrayList(); col.add("Hello" + "01"); col.add("Hello" + "02"); col.add(new Book("三體1", 30.4)); col.add(new Book("三體2", 33.4)); col.add(new Book("三體3", 31.4)); /* * Iterator 核心方法 hasNext() next() * 通常遍歷使用while */ Iterator iterator = col.iterator(); System.out.println(iterator.getClass());//iterator執行型別java.util.ArrayList$Itr while(iterator.hasNext()) { //首先判斷是否還有下一個元素 System.out.println(iterator.next()); //直接輸出元素內容,如果是自定義類,需要重新toString } //在使用迭代器遍歷完一次集合後,一定要重置迭代器。否則迭代器將一直指向最後一個元素,就不能進行下一次遍歷 iterator = col.iterator(); } } class Book{ private String name; private double price; public Book(String name, double price) { super(); this.name = name; this.price = price; } @Override public String toString() { return "Book [name=" + name + ", price=" + price + "]"; } }
增強for迴圈遍歷
jdk5.0出現了增強for迴圈,可以代替iterator迭代器,特點:增強for就是簡化版的iterator,本質一樣。只能用於遍歷集合或陣列。
基本語法:
for(元素型別 元素名 : 集合名或陣列名) {
訪問元素
}
package class_collection; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; public class ClassTest02_ForeachCollection { @SuppressWarnings({ "rawtypes", "unchecked" }) public static void main(String[] args) { Collection col = new ArrayList(); col.add("Hello" + "01"); col.add("Hello" + "02"); col.add(new Book("三體1", 30.4)); col.add(new Book("三體2", 33.4)); col.add(new Book("三體3", 31.4)); /* 增強for迴圈本質上,還是使用Iterator迭代器。 只不過是提供的一種更加方便的形式。 */ //Debug看原始碼 for(Object obj : col) { System.out.println(obj); } } class Book{ private String name; private double price; public Book(String name, double price) { super(); this.name = name; this.price = price; } @Override public String toString() { return "Book [name=" + name + ", price=" + price + "]"; } }
Collection練習
建立 3個 Dog {name, age} 物件,放入到 ArrayList 中,賦給 List 引用
用迭代器和增強for迴圈兩種方式來遍歷
重寫Dog 的toString方法, 輸出name和age
import java.util.List; import java.util.ArrayList; import java.util.Iterator; public class ClassWork01 { @SuppressWarnings({ "unused", "rawtypes", "unchecked" }) public static void main(String[] args) { List list = new ArrayList(); list.add(new Dog("小白",3)); list.add(new Dog("小花",8)); list.add(new Dog("小黑",6)); //迭代器 Iterator ite = list.iterator(); while(ite.hasNext()) { System.out.println(ite.next()); //next()取出集合中的下一個物件,預設呼叫toString } // ite = list.iterator(); //使用迭代器,在遍歷完之後,一定要重置。因為索引已經走到了最後。 //未重置迭代器,此迴圈無輸出 while(ite.hasNext()) { System.out.println(ite.next()); } System.out.println("======================="); //增強for迴圈 for(Object obj:list) { System.out.println(obj); //編譯型別為Object,動態繫結到Dog } } } class Dog{ private String name; private int age; public Dog(String name, int age) { super(); this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Dog [name=" + name + ", age=" + age + "]"; } }
程式輸出
Dog [name=小白, age=3]
Dog [name=小花, age=8]
Dog [name=小黑, age=6]
==========================
Dog [name=小白, age=3]
Dog [name=小花, age=8]