1. 程式人生 > >談談Java的Collection介面

談談Java的Collection介面

目錄

  • 談談Collection
    • 前言
    • Collection
    • 方法
      • 1.boolean add(E)
      • 2.void clear()
      • 3.boolean contains(Object o)
      • 4.boolean isEmpty()
      • 5.Iterator iterator()
      • 6.int size()
      • 7.Boolean remove()
    • 總結
      • 什麼是可選操作
      • 集合使用的整體框架(步驟)

談談Collection

前言

這一篇講的collection介面;首先,集合是用來儲存資料的,它是基於某種資料結構資料容器。常見的資料結構:陣列(Array)、集(Set)、佇列(Queue)、連結串列(Linkedlist)、樹(Tree)、堆(Heap)、棧(Stack)和對映(Map)等結構。集合大類分為了Collection和Map。如下圖

Collection

這一篇文章的內容——現在講下collection,“集合、容器”,用來儲存資料的,它是一個介面,不能直接例項化使用;只能通過它的子類來完成,從上圖來看,Collection分為List和Set,List集合中的元素是有序的、可重複的,而Set集合中的元素是無序的、不能重複的。List集合強調的是有序,Set集合強調的是不重複。下面是它的已知實現類。

Collection是描述所有序列容器的共性的根介面,可能會被認為是一個附屬介面,即因為要表示其他若干個介面的共性而出現的介面。同時為什麼要將其作為介面?是因為可以使我們能夠建立更通用的程式碼。通過針對介面而非具體實現來編寫程式碼,這樣,才可以更好地應用於更多的物件型別。

下面的是Collection更加仔細一點的分類。今天這篇重點介紹一下Collection的幾個方法,掌握了這些,對於它的子類都是可以直接拿來用的。子類的介紹後面再總結出來。

方法

遇到一些自己不熟的知識點,在IDEA上可以直接檢視該介面的詳細原始碼(ctrl加滑鼠左鍵),點開旁邊的結構圖按鈕,可以直觀得去檢視這些方法

1.boolean add(E)

這個一看就知道了,就是新增功能,往集合裡面新增元素或者物件的方法,若是list這種,因為它返回都是true,一般情況下,可以隨便往裡面新增。

Collection s = new Collection();
s.add(你要新增的);
s.add("你要新增的");

有時需要注意的時候,如果操作的集合是不允許重複值的,往裡面新增就會報錯。返回的是false.

2.void clear()

移除容器中的所有元素,該集合不支援移除的話就會丟擲UnsupportedOperationException異常(不支援該操作)

//接著用上面的s集合
s.clear();
//這時候集合為空了

3.boolean contains(Object o)

用來檢查此集合是否包含指定元素或者物件,包含則返回true不包含就返回false;會返回兩種錯誤。

4.boolean isEmpty()

用來檢查集合中是否為空,如果為空就返回true。

5.Iterator iterator()

返回一個Iterator迭代器,這個方法是用來遍歷集合中的元素的,在一些需要獲取集合中的元素(包括列印輸出,呼叫等場景下),依賴於集合而存在的,有next方法和hasNext方法。

這兩個方法一般情況下都是繫結一起用的。形式如下。

//其主要的用法如下,遍歷的功能
//通過集合物件獲取迭代器物件
Iterator i = 集合.iterator();
//hasNext方法是布林型的返回值,有元素在集合裡面的時候就會返回true
while(it.hasNext()){
    System.out.println(it.next());
}

6.int size()

用來返回的集合的長度,也就是集合裡面的元素的個數。

//直接使用,返回長度
集合.size();

7.Boolean remove()

用來刪除集合中的元素,物件,只要有移除動作就會返回true。

總結

什麼是可選操作

在看原始碼的時候,會發現有些方法在後面會標記為可選操作 (optional operation)。

執行各種不同的新增和移除的方法在Colletion介面中都是可選操作,這意味著實現類並不需要為這些方法提供功能定義。......如果一個操作是可選的,編譯器仍舊會嚴格要求你只能呼叫該介面中的方法。

它宣告呼叫某些方法將不會執行有意義的行為,相反,它們會丟擲異常。 ——《Java程式設計思想》

異常UnsupportedOperationException(這個和上面講remove時候不支援操作的時候丟擲一樣的異常)

大概意思是collection子類可以重寫這個方法以達到子類自己的目的,也可以不覆蓋這個方法但是。沒有實現這個方法的子類使用這個方法的話會丟擲UnsupportedOperationException異常。(這個未獲得支援的異常在執行時候才能探測到,屬於動態型別異常),先看下報錯的程式碼示例

package music.daima.ebook;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;

/**
 * @author yhy
 * 這個是用來觀察java中的可選操作方法的一些特點以及定義使用以及報錯的原因,這是書上的程式碼
 */
public class Unsupport {
    
    static void test(String msg, List<String> list) {
        System.out.println("--- " + msg + " ---");
        Collection<String> c = list;
        Collection<String> subList = list.subList(1,8);
        Collection<String> c2 = new ArrayList<String>(subList);
        try {
            c.retainAll(c2);
        }
        catch(Exception e) {
            System.out.println("retainAll(): " + e);
        }
        try { c.removeAll(c2); } catch(Exception e) {
            System.out.println("removeAll(): " + e);
        }
        try { c.clear(); } catch(Exception e) {
            System.out.println("clear(): " + e);
        }
        try { c.add("X"); } catch(Exception e) {
            System.out.println("add(): " + e);
        }
        try { c.addAll(c2); } catch(Exception e) {
            System.out.println("addAll(): " + e);
        }
        try { c.remove("C"); } catch(Exception e) {
            System.out.println("remove(): " + e);
        }
        // The List.set() 雖然改變了值但沒有改變它的資料結構尺寸
        try {
            list.set(0, "X");
        } catch(Exception e) {
            System.out.println("List.set(): " + e);
        }
    }
    public static void main(String[] args) {
        //asList方法:返回由指定陣列支援的固定大小的列表。 (將返回的列表更改為“寫入陣列”。)該方法作為基於陣列和基於集合的API之間的橋樑,與Collection.toArray()相結合 。 
        //返回的列表是可序列化的,並實現RandomAccess 。 此方法還提供了一種方便的方式來建立一個初始化為包含幾個元素的固定大小的列表:
        List<String> list  = Arrays.asList("A B C D E F G H I J K L".split(" "));
        System.out.println(list.getClass());
        test("Arrays.asList()", list);
        // System.out.println(list1.getClass());
        test("Modifiable Copy", new ArrayList<String>(list));
        //test("unmodifiableList()",Collections.unmodifiableList(new ArrayList<String>(list)));
    }

}

output(輸出):

集合使用的整體框架(步驟)

相關推薦

談談多執行緒Runnable和Callable介面

Runnable介面程式碼 public interface Runnable { public abstract void run(); } Callable介面程式碼 public interface Callable<V> { V c

談談Go語言的Restful介面開發

前言: 如今微服務、無伺服器架構大行其道。而API開發是這些話題的主角。 Go語言開發效率要比Java Spring要快一些,效能上比PHP高出一個數量級。尤其是Go語言在併發方便非常的優秀,是接下來值得關注的一門語言。 本人近來學習go語言,想基於Go做Web API,經過調研

合理的佈局,絢麗的樣式,談談Winform程式的介面設計

從事Winform開發很多年了,由於專案的需要,設計過各種各樣的介面效果。一般來說,運用傳統的介面控制元件元素,合理設計佈局,能夠設計出比較中規中矩的標準介面;利用一些換膚的控制元件或者部分介面元件,能夠設計出相對好看一些的介面效果,如以前很盛行的ActiveSkin、IrisSkin和DotNetSkin等

談談應用軟體人機介面開發的組織框架編寫

    一款好的電子產品,肯定少不了一個好的軟體框架,首先我們來看下: 一般來說我們的產品都有按鍵,按鍵用來操作相應的介面,那就會有相應的介面處理方法,以下有兩種結構的編寫: A類編寫: void left_key_process(int current_p

談談Java的Collection介面

目錄 談談Collection 前言 Collection 方法 1.boolean add(E) 2.void clear() 3.boolean conta

簡單談談網路抓包,特別是thrift 介面

> 按照慣例先談談最近情況,最近不是剛好跨年嗎?看到很多人都在寫年度總結,所以我也在寫年度總結文章(其實之前我基本沒有寫過的,今年有點感觸,也想記錄一下),結果發現寫起來有點多,之前還想著元旦前發出來,結果元旦過後,今天我也還在寫,而且還寫不完,不過也差不多了,預計明天會發出來。然後最近需求比較多,工作

創建對象與使用對象——談談工廠的作用

方便 構圖 erb aof 常用 uda 行為 too jpg 工廠模式(包括簡單工廠模式、工廠方法模式和抽象工廠模式)到底有什麽用,很多時候通過反射機制就可以很靈活地創建對象,為毛還要工廠?,在本文中我將圍繞創建對象和使用對象來簡單談談工廠的作用。 與一個對象

分針網——IT教育:談談React那些小事

React 說起React,那也是近一年多時間火起來的前端框架,其在Facebook的影響力和大力推廣下,已然成為目前前端界的中流砥柱。在如今的前端框架界,React、Vue、Angular三分天下的時代已經到來,而曾經jQuery一統天下的局面已一去不復返。三分天下,前端雖亂,但美其名曰“繁榮”

談談PHP網站的防SQL註入

效果 query 數據庫服務 data sqlite nbsp lds esc informix SQL(Structured Query Language)即結構化查詢語言。SQL 註入,就是把 SQL 命令插入到 Web 表單的輸入域或頁面請求參數的查詢字符串中,在 W

談談企業的數據工作!——企業的數據分析能力金字塔

大數據 數據分析 寫在前面筆者寫這篇文章的初衷源於兩個故事: 故事一:一位在互聯網行業做數據庫架構多年的同事一起吃飯,問起我現在在說什麽,我說自己在做醫療方面數據分析,同事笑,說:你有很多資源啊,只要你能拿到電子病例的數據,就能分析很多東西了……我臉上的微笑表情瞬間僵化! 故事二:當時為內蒙一個企業做

談談Vagrant中的那些坑:CentOS

不起作用 通過 tar nat 工作 主機 生產 疑問 什麽 安裝了vagrant之後,當然需要將它投入使用。由於計劃中的生產環境是 CentOS 7,因此想搭建一個 基於CentOS 7(x86_64)的虛擬開發環境。 最開始的一系列工作,比如在vbox中安裝CentOS

尚學堂java培訓怎麽樣?談談我在尚學堂學習的心得體會

培訓機構 尚學堂 參加尚學堂java培訓班有一段時間了,今天有點時間,來分享下這段時間在尚學堂學java的心得體會。 學java編程很枯燥也很乏味,每天就是對著電腦敲寫著代碼,一行行代碼在電腦鍵盤的敲擊下就如同壘城堡一般,必須很專註很認真仔細,因為稍不留神一個標點符號,或者大小寫一點點小錯誤

談談回文子串

image 復雜 整體 ++ 暴力 技術 判斷 span bsp 引子 1. 先講個歪果仁的故事,在龐貝古城的廢墟中,有一座名為赫庫蘭尼姆的城市,在這個遺跡中人們發現一塊石碑,石碑上寫著一個非常有趣的拉丁串:sator arepo tenet opera rotas翻譯到

談談java創建對象

裏的 最大 線程安全 tostring 現實 創建多個對象 語言 安全問題 thread   作為一門面向對象的語言,我們學習java,對於對象的學習非常重要。大多的教程上都用抽象的概念驅使著我們理解對象,把現實抽象為對象。然而忽略對創建對象的研究。如果說學習抽象思維,運用

談談我對Linux系統學習的歷程回顧

linux眾所周知,Windows 和Linux 是目前最流行的2個操作系統。Windows系統適合普通用戶,它的優勢是圖形化界面,簡單易用,使用起來門檻很低,很容易上手,所以,windows占有了大多數普通用戶群體。而Linux 被譽為黑客的操作系統,因其穩定和命令行操作的高效性而廣泛用於開發工作,占有絕大

談談環保問題之四-做環保的程序員

校園 -1 大學 bsp 服務 互聯網 沒有 普通 名片   一直想談談節制這個問題,俏皮一點來講,我們要做環保的程序員。   記得大學一年級那會,學校的政策是不讓學生用電腦,良苦用心怕我們沈迷網絡,考不過英語四級。也怪當時的手機還不是智能機,個別能上W

談談字符串那點事

沒有 register 用戶 今後 過程 破解 插件 運行 tro 在od破解軟件過程中,大家對於字符串應該是再熟悉不過了,但是往往事情不盡如人意,總是搜索不到想要的字符串,這時往往有的人會被迫用別的方法,消息斷點,內存斷點,硬件斷點等等,今天咱們只談字符串,把我所掌握的查

談談近兩年維護的一個最最坑爹項目

項目代碼 text 讓我 data- 來講 vs打開 源碼 。。 data 做程序員這一行的,最怕的就是維護公司曾經舊的項目,這些項目往往都有著文檔缺少、數據混亂、代碼混亂、凝視極少、歷經多個維護人員等一些問題。最近樓主維護了一個非常極品的項目,

談談多線程開發中的線程和任務的理念

計算 機制 需求 spa 是把 發的 多少 代碼 編程技術 前段時間寫了一個iOS端的數據統計SDK,數據統計有些復雜的計算和數據上報操作。由於有些操作比較耗時。所以不得不在後臺線程進行操作,由此引發了我對多線程的思考,在iOS開發中,一般非常難再見到直接使用NST

談談你對Hibernate的理解

其他 onf 數據庫 配置數據庫連接 hql 通過 成就 建立 span 答: 1. 面向對象設計的軟件內部運行過程可以理解成就是在不斷創建各種新對象、建立對象之間的關系,調用對象的方法來改變各個對象的狀態和對象消亡的過程,不管程序運行的過程和操作怎麽樣,本質上都是要得到一