1. 程式人生 > >Java集合框架概述和集合的遍歷

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

第三階段 JAVA常見物件的學習

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

(一) 集合框架的概述

(1) 集合的由來

如果一個程式只包含固定數量的且其生命週期都是已知的物件,那麼這是一個非常簡單的程式。

通常,程式總是根據執行時才知道的某些條件去建立新物件。在此之前,不會知道你所需要物件的數量,甚至不知道確切的型別。為了解決這個普遍的程式設計問題,需要在任意時刻和任意位置建立任意數量的物件。所以,就不能依靠建立命名的引用來持有每一個物件,因為你不知道實際上會需要多少這樣的引用

​ ——Thinking in Java

我們來簡單的解釋一下:

首先要知道我們所學習的Java語言是一個完全面向物件

的語言,而這種語言對事物的描述是通過物件體現的,為了方便對多個物件進行操作,我們就必須把這多個物件進行儲存

一個基本型別的變數顯然是無法滿足儲存多個物件的,所以應該是一個容器型別的變數,通過前面的知識,我們知道陣列和StringBuffe、StringBuilder均屬於容器型別。但是呢? StringBuffer的結果是一個字串,不一定滿足我們的要求,所以我們只能選擇陣列,這就是物件陣列。

可是問題又來了,物件陣列又不能適應變化的需求,因為陣列的長度是固定的,這個時候,為了適應變化的需求,Java就提供了集合類供我們使用。

(2) 陣列和集合的區別?

A:長度區別

陣列的長度固定

集合長度可變

B:內容不同

陣列儲存的是同一種類型的元素

而集合可以儲存不同型別的元素

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技術的公眾號:理想二旬不止

相關推薦

Java集合框架概述集合

第三階段 JAVA常見物件的學習 集合框架概述和集合的遍歷 (一) 集合框架的概述 (1) 集合的由來 如果一個程式只包含固定數

二叉樹的高度 java 利用遞迴層次兩種方法

原文:http://blog.csdn.net/fangchao3652/article/details/53456468 ackage edu.lnu.fang.BiTree; import java.util.ArrayList; import java.util.L

java集合學習之List(二)隨機訪問RandomAccess介面ArrayListLinkedList效能問題

ArrayList這個類是實現了RandomAccess介面的,RandomAccess介面和Serializable介面一樣都是沒有方法或者欄位的,像是一個標誌,RandomAccess介面文件說明的是:Marker interface used by <tt>

java:集合框架(HashMapHashtable的區別)

* HashMap和Hashtable的區別         * Hashtable是JDK1.0版本出現的,是執行緒安全的,效率低,HashMap是JDK1.2版本出現的,是執行緒不安全的,效率高  

Java中的集合框架-CollectionsArrays

  上一篇《Java中的集合框架-Map》把集合框架中的鍵值對容器Map中常用的知識記錄了一下,本節記錄一下集合框架的兩個工具類Collections和Arrays 一,Collections   Collections類中的方法全部都是靜態的,它可以對Collection和Map進行一些操作,並返回這些

Java 學習筆記 兩大集合框架MapCollection

兩大框架圖解 Collection介面 由第一張圖,我們可以知道,Collection介面的子介面有三種,分別是List介面,Set介面和Queue介面 List介面 允許有重複的元素,元素按照新增的順序進行排序 介面方法 void add(int index,Obj

集合Set迭代器陣列

import java.util.Date; import java.util.HashSet; import java.util.Iterator; import java.util.Set; public class IteratorAndArra

JavaSE入門學習33:Java集合框架概述

        一集合框架         (1)集合的概念         現實生活中的集合:很多的事物湊在一起。         數學中的集合:具有共同屬性的事物的總體。         Java

java增強型for迴圈(三種集合方式)

For-Each迴圈         For-Each迴圈也叫增強型的for迴圈,或者叫foreach迴圈。    For-Each迴圈是JDK5.0的新特性(其他新特性比如泛型、自動裝箱等)。    For-Each迴圈的加入簡化了集合的遍歷。 語法如下: fo

Java 集合框架原始碼分析-集合框架概述

集合框架介紹   Java集合工具包位於Java.util包下,包含了很多常用的資料結構,如陣列、連結串列、棧、佇列、集合、雜湊表等。學習Java集合框架下大致可以分為如下五個部分:List列表、Set集合、Map對映、迭代器(Iterator、Enumera

Java程式設計】foreach支援集合、Collection、Iterable原因分析

1、Collection、AbstractCollection、Iterable關係 Iterator是一個介面 public interface Iterator<E> { boolean hasNext(); E next();

Java多執行緒--併發集合框架概述

最近被陸陸續續問了幾遍HashMap的實現,回答的不好,打算複習複習JDK中的集合框架,並嘗試分析其原始碼,這麼做一方面是這些類非常實用,掌握其實現能更好的優化我們的程式;另一方面是學習借鑑JDK是如何實現了這麼一套優雅高效的類庫,提升程式設計能力。 在介紹具體適合類之

用foreachIterator集合的方法

package TestMap; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; /** * Created by Adm

Java集合框架概述

概述 什麼是集合? 這Java官方的入門文件是這樣描述集合的: Collection(有時候也叫container)是一個簡單的物件,它把多個元素組織成一個單元。集合可以用來儲存、檢索、操作、通訊。通常情況下,集合代表了一個自然資料項,比如一組手牌(牌的集合)、郵

Java集合怎麼一邊刪除一邊

問題描述: Java新手容易犯一個錯誤,就是遍歷集合的同時刪除集合的元素。那麼程式會發生什麼呢?下面舉個小例子。 import java.util.HashSet; import java.ut

集合框架(ListSet)

null tla sheet 1.2 rfi table name blog runtime 一、概述 集合是一種可變數據項的容器,具有統一的父類接口Collect

Map集合的四種常用方式整理

lenovo pre imp main string hash 常用 eno ash 1.Map集合簡介:map集合是一個key—value型的數據結構,存儲的數據具有查詢速度快速的特點,但由於是無序的,所以沒有順序可言。在遍歷時沒有辦法像簡單的list或數組一樣。 2.代

(1)StringBuilder類StringBuffer類 (2)日期相關的類 (3)集合框架 (4)List集合

pen 存在 子集 delet retain contain 基本概念 包裝 1.0 1.StringBuilder類和StringBuffer類(查手冊會用即可)1.1 基本概念 由於String類描述的字符串內容無法更改,若程序中出現大量類似的字符串時需要申請獨立

集合裝換成陣列

public class Demo3_Collection { /** * * A:集合的遍歷 * 其實就是依次獲取集合中的每一個元素。 * B:案例演示 * 把集合轉成陣列,可以實現集合的遍歷 * toArray() */ public static v

集合框架概述

集合框架 集合:用來存放很多元素的一種型別。例如一個班級,一個購物車。 又叫集合容器。 框架:結構體系,很多類組成。 Java Collection Framework=Java 集合框架 JCF 1. 陣列和集合的關係 陣列定長,只能存同一種類型 Type mismatc