Java基礎之:集合——Collection


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中也能夠使用,所以比較重要。

  1. add:添加單個元素

  2. remove:刪除指定元素

  3. contains:查找元素是否存在

  4. size:獲取元素個數

  5. isEmpty:判斷是否為空

  6. addAll:添加多個元素

  7. containsAll:查找多個元素是否都存在

  8. removeAll:刪除多個元素

  9. 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對象,則必須要有一個需要被迭代的集合。

 

迭代器執行原理:

  1. 創建迭代器 Iterator iterator = col.iterator();

  2. 使用hasNext()方法判斷是否還有下一個元素:iterator.hasNext(); //T or F

  3. 使用next()方法將指針下移並返回下移后指針指向的元素:System.out.println(iterator.next());

  4. 在使用迭代器遍歷完一次集合后,一定要重置迭代器。否則迭代器將一直指向最后一個元素,就不能進行下一次遍歷。

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]

Dog [name=小黑, age=6]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM