Java集合框架概述和集合的遍歷

第三階段 JAVA常見對象的學習

集合框架概述和集合的遍歷

(一) 集合框架的概述

(1) 集合的由來

若是一個程序只包含固定數量的且其生命週期都是已知的對象,那麼這是一個很是簡單的程序。

一般,程序老是根據運行時才知道的某些條件去建立新對象。在此以前,不會知道你所須要對象的數量,甚至不知道確切的類型。爲了解決這個廣泛的編程問題,須要在任意時刻和任意位置建立任意數量的對象。因此,就不能依靠建立命名的引用來持有每個對象,由於你不知道實際上會須要多少這樣的引用java

​ ——Thinking in Java面試

咱們來簡單的解釋一下:編程

首先要知道咱們所學習的Java語言是一個徹底面向對象的語言,而這種語言對事物的描述是經過對象體現的,爲了方便對多個對象進行操做,咱們就必須把這多個對象進行存儲數組

一個基本類型的變量顯然是沒法知足存儲多個對象的,因此應該是一個容器類型的變量,經過前面的知識,咱們知道數組和StringBuffe、StringBuilder均屬於容器類型。可是呢? StringBuffer的結果是一個字符串,不必定知足咱們的要求,因此咱們只能選擇數組,這就是對象數組。數據結構

但是問題又來了,對象數組又不能適應變化的需求,由於數組的長度是固定的,這個時候,爲了適應變化的需求,Java就提供了集合類供咱們使用。框架

(2) 數組和集合的區別?

A:長度區別學習

數組的長度固定ui

集合長度可變spa

B:內容不一樣code

數組存儲的是同一種類型的元素

而集合能夠存儲不一樣類型的元素

C:元素的數據類型問題

數組能夠存儲基本數據類型,也能夠存儲引用數據類型

集合只能存儲引用類型(裝對象)

雖然數組看起來有一絲不太靈活,但數組也確實是保存一組對象的有效方法,若是想要保存一組基本數據類型,咱們也推薦使用這種方法,只是因爲其長度固定,致使它在不少時候也受到一些限制。

補充:

在Java中,數組是一種效率最高的存儲和隨機訪問對象的引用序列的方式。數組就是一個簡單的線性序列,這使得元素訪問很是快速。可是爲這種速度所付出的代價是數組對象的大小被固定,而且在其生命週期中不可改變。你可能會建議使用ArrayList,它能夠經過建立一個新實例,而後把舊實例中全部的引用到移到新實例中,從而實現更多空間的自動分配。儘管一般應該首選ArrayList而不是數組、可是這種彈性須要開銷,所以,ArrayList的效率比數組低不少。

——Thinking in Java 第16章

(3) 集合框架關係,以及Collection 類簡介

Java提供了不少種集合類,他們的數據結構是不一樣的,可是,它們確定有一些共性的地方 (存儲,獲取,判斷)一直向上追溯,咱們能夠的獲得這樣繼承體系

Collection : 是集合的頂層接口,它的子體系有重複的,有惟一的,有有序的,有無序的。

Collection c = new Collection(); //這是錯誤的 接口不能實例化

Collection的功能概述:

1:添加功能

//添加一個元素
Boolean add(Object obj)

//添加一個集合的元素
Boolean addAll(Collection c)

2:刪除功能

//移除全部元素  
void clear()

//移除一個元素
boolean remove(Object o)

//移除一個集合的元素(有一個移除就返回true)
Boolean removeAll(Collection c)

3:判斷功能

//判斷集合中是否包含指定的元素
Boolean contains(Object o)

//判斷集合中是否包含指定的集合元素(包含全部)
Boolean containsAll(Collection c)

//判斷集合是否爲空
Boolean isEmpty()

4:獲取功能(重點)

Iterator<E> iterator()

5:長度功能

int size()

面試題:數組有沒有length()方法呢?字符串有沒有length()方法呢?集合有沒有length()方法呢?

數組求長度用length屬性

字符串求長度用length()方法

集合求長度用size()方法

6:交集功能

//兩個集合A B ,A對B交集,最終的結果保存在A    中,B不變。返回值表示的是A是否發生過改變
boolean retainAll(Collection c)

7:把集合轉換爲數組

Object[] toArray()

(二) 集合的遍歷

(1) 集合轉數組遍歷

import java.util.ArrayList;
import java.util.Collection;

public class Demo {
    public static void main(String[] args) {
        Collection c = new ArrayList();
        c.add("I");
        c.add("love");
        c.add("you");
        c.add("!");

        Object[] objs = c.toArray();
        for (int x = 0; x < objs.length; x++) {
            //System.out.println(objs[x]);
            //獲得的元素是字符串,我在獲取到元素的同時,若是還想知道元素的長度
            //System.out.println(objs[x] + "---" + objs[x].length());
            //上述代碼實現不了是由於,Object中沒有length()方法
            //咱們想要使用字符串的方法,就必須把元素還原成字符串
            //向下轉型
            String s = (String) objs[x];
            System.out.println(s + "---" + s.length());
        }
    }
}
/*
 *    Collection存儲自定義對象並遍歷案例
 */

import java.util.ArrayList;
import java.util.Collection;

public class StudentDemo {
    public static void main(String[] args) {
        //建立集合對象
        Collection c = new ArrayList();

        //建立學生對象
        Student s1 = new Student("admin", 10);
        Student s2 = new Student("張三", 20);
        Student s3 = new Student("李四", 30);
        Student s4 = new Student("王五", 40);

        //把學生添加到集合
        c.add(s1);
        c.add(s2);
        c.add(s3);
        c.add(s4);

        //把集合轉化爲數組
        Object[] objs = c.toArray();
        //遍歷數組
        for (int x = 0; x < objs.length; x++) {
            //System.out.println(objs[x]);
            //獲得的元素是字符串,我在獲取到元素的同時,若是還想知道元素的長度
            //System.out.println(objs[x] + "---" + objs[x].length());
            //上述代碼實現不了是由於,Object中沒有length()方法
            //咱們想要使用字符串的方法,就必須把元素還原成字符串
            //向下轉型
            Student s = (Student) objs[x];
            System.out.println(s.getName() + "-" + s.getAge());
        }

    }
}

(2) 集合迭代器遍歷

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

/*
 *  Iterator iterator() 迭代器,集合的專用遍歷方式
 *  Object next():獲取元素
 *  oolean hasNext():若是仍有元素能夠迭代,則返回 true。
 */
public class IteratorDemo {
    public static void main(String[] args) {
        //建立集合對象
        Collection c = new ArrayList();
        c.add("I");
        c.add("love");
        c.add("you");
        c.add("!");

        //實際返回的確定是子類對象,這裏是多態
        Iterator it = c.iterator();

        while (it.hasNext()) {
            String s = (String) it.next();
            System.out.println(s);
        }
    }
}

//運行結果
I
love
you
!
集合的使用步驟:
  1. 建立集合元素
  2. 建立元素對象
  3. 把元素添加到集合
  4. 遍歷集合

    (1) 經過集合對象獲取迭代器對象 —— Iterator it = c.iterator();

    (2) 經過迭代器對象的hasNext()方法判斷是否有元素 ——while

    經過迭代器對象的next()方法獲取元素而且移動到下一個位置

迭代器爲何不定義成一個類,而是一個接口?

假設迭代器定義的是一個類,這樣咱們就能夠建立該類的對象,調用該類的方法來實現集合的遍歷。可是呢?咱們想一想,Java中提供了不少的集合類,而這些集合類的數據結構是不一樣的,因此存儲的方式和遍歷的方式應該是不一樣的。進而它們的遍歷方式也應該是不一樣的,最終就沒有定義迭代器類。

而不管你是哪一種集合,你都應該具有獲取元素的操做,而且,最好再輔助於判斷功能,這樣在獲取前,先判斷,這樣就更不容易出錯。也就是說,判斷功能和獲取功能應該是一個集合遍歷所具有的,而每種集合的方式又不太同樣,因此咱們把這兩個功能給提取出來,並不提供具體實現,這種方式就是接口。

那麼,真正的具體實現類在哪裏呢?

在真正的具體的子類中,之內部類的方式體現。

結尾:

若是內容中有什麼不足,或者錯誤的地方,歡迎你們給我留言提出意見, 蟹蟹你們 !^_^

若是能幫到你的話,那就來關注我吧!(系列文章均會在公衆號第一時間更新)

在這裏的咱們素不相識,卻都在爲了本身的夢而努力 ❤

一個堅持推送原創Java技術的公衆號:理想二旬不止

img

相關文章
相關標籤/搜索