1. 程式人生 > >java集合框架(二) Collection架構與原始碼分析

java集合框架(二) Collection架構與原始碼分析

Collection是一個介面,它主要的兩個分支是List和Set。

List和Set都是介面,它繼承於Collection。
List是有序佇列,可以用重複的元素;
Set元素無序,並且不可重複;
List和Set都有他們各自的實現類

為了方便,我們抽象出AbstractCollection類來讓其他類繼承,該類實現類Collection中的絕大部分方法。AbstractList和AbstractSet都繼承與AbstractCollection,具體的List實現類繼承與AbstractList,而Set的實現類則繼承與AbstractSet。

另外,Collection中有個iterator()方法,它的作用是返回一個Iterator介面。通常,我們通過Iterator迭代器來遍歷集合。ListIterator是List介面所特有的,在List介面中,通過ListIterator()返回一個ListIterator物件。
我們首先來閱讀下這些 介面和抽象類以及他們的實現類中都有哪些方法:

1、Collection
Collection的定義如下:
public interface Collection extends Iterable{}
從他的定義中可以看出,Collection是一個介面,他是高度抽象出來的集合,包含了集合的基本操作:新增、刪除、清空、遍歷、是否為空,獲取大小等。
booleanadd(E o)
確保此 collection 包含指定的元素(可選操作)。booleanaddAll(Collection

下面看一下AbstractCollection實現的部分方法的原始碼:

public abstract class AbstractCollection implements Collection {
protected AbstractCollection() {
}

public abstract Iterator<E> iterator();//iterator()方法沒有實現  

public abstract int size(); //size()方法也沒有實現  

public boolean isEmpty() { //檢測集合是否為空  
    return size() == 0;  
}  
/*檢查集合中是否包含特定物件*/  
public boolean contains(Object o) {   
    Iterator<E> it = iterator();  
    if (o==null) {  
        while (it.hasNext()) //從這裡可以看出,任何非空集合都包含null  
            if (it.next()==null)  
                return true;  
    } else {  
        while (it.hasNext())  
            if (o.equals(it.next()))  
                return true;  
    }  
    return false;  
}  
/*將集合轉變成陣列*/  
public Object[] toArray() {  
    // Estimate size of array; be prepared to see more or fewer elements  
    Object[] r = new Object[size()]; //建立與集合大小相同的陣列  
    Iterator<E> it = iterator();  
    for (int i = 0; i < r.length; i++) {  
        if (! it.hasNext()) // fewer elements than expected  
            //Arrays.copy(**,**)的第二個引數是待copy的長度,如果這個長度大於r,則保留r的長度  
            return Arrays.copyOf(r, i);  
        r[i] = it.next();  
    }  
    return it.hasNext() ? finishToArray(r, it) : r;  
}  

public <T> T[] toArray(T[] a) {  
    // Estimate size of array; be prepared to see more or fewer elements  
    int size = size();  
    T[] r = a.length >= size ? a :  
              (T[])java.lang.reflect.Array  
              .newInstance(a.getClass().getComponentType(), size);  
    Iterator<E> it = iterator();  

    for (int i = 0; i < r.length; i++) {  
        if (! it.hasNext()) { // fewer elements than expected  
            if (a == r) {  
                r[i] = null; // null-terminate  
            } else if (a.length < i) {  
                return Arrays.copyOf(r, i);  
            } else {  
                System.arraycopy(r, 0, a, 0, i);  
                if (a.length > i) {  
                    a[i] = null;  
                }  
            }  
            return a;  
        }  
        r[i] = (T)it.next();  
    }  
    // more elements than expected  
    return it.hasNext() ? finishToArray(r, it) : r;  
}  

private static <T> T[] finishToArray(T[] r, Iterator<?> it) {  
    int i = r.length;  
    while (it.hasNext()) {  
        int cap = r.length;  
        if (i == cap) {  
            int newCap = cap + (cap >> 1) + 1;  
            // overflow-conscious code  
            if (newCap - MAX_ARRAY_SIZE > 0)  
                newCap = hugeCapacity(cap + 1);  
            r = Arrays.copyOf(r, newCap);  
        }  
        r[i++] = (T)it.next();  
    }  
    // trim if overallocated  
    return (i == r.length) ? r : Arrays.copyOf(r, i);  
}  

private static int hugeCapacity(int minCapacity) {  
    if (minCapacity < 0) // overflow  
        throw new OutOfMemoryError  
            ("Required array size too large");  
    return (minCapacity > MAX_ARRAY_SIZE) ?  
        Integer.MAX_VALUE :  
        MAX_ARRAY_SIZE;  
}  

// 刪除物件o  
public boolean remove(Object o) {  
    Iterator<E> it = iterator();  
    if (o==null) {  
        while (it.hasNext()) {  
            if (it.next()==null) {  
                it.remove();  
                return true;  
            }  
        }  
    } else {  
        while (it.hasNext()) {  
            if (o.equals(it.next())) {  
                it.remove();  
                return true;  
            }  
        }  
    }  
    return false;  
}  
    // 判斷是否包含集合c中所有元素 
public boolean containsAll(Collection

相關推薦

java集合框架 Collection架構原始碼分析

Collection是一個介面,它主要的兩個分支是List和Set。 List和Set都是介面,它繼承於Collection。 List是有序佇列,可以用重複的元素; Set元素無序,並且不可重複; List和Set都有他們各自的實現類 為了方便,我們

(Java)集合框架Collection介面方法、Iterator迭代器、增強for迴圈

【Collection介面】  import java.util.ArrayList; import java.util.Collection; /* * Collection介面中的方法 是集合中所有實現類必須擁有的方法 * 程式演示,使用Collection

java集合框架

本文是“最最最常見Java面試題總結”系列第三週的文章。 主要內容: Arraylist 與 LinkedList 異同 ArrayList 與 Vector 區別 HashMap的底層實現 HashMap 和 Hashtable 的區別 HashMap 的

黑馬程式設計師——Java集合框架之泛型

培訓、java培訓、java學習型技術部落格、期待與您交流!------------               泛型 一、泛型概述 1.什麼是泛型? 泛型就是指將資料型別引數化,把以前固定的資料型別用一個代表資料型別的引數進行表示,該引數可以接受傳入的任意資料型別。可以這

java集合框架Collection

       本篇文章轉載自:http://blog.csdn.net/qq_28261343/article/details/52614411  Java集合框架主要由Collection和Map兩個根介面及其子介面、實現類組成。Java集合也大致可分為Set、List和

Java集合框架之ListSet的contains()方法

Java集合框架(上)介紹了List與Set的基本用法:增刪改查,Java集合框架(中)介紹了Map的基本用法:增刪改查。但是還不夠運用於實際應用,下面就開始介紹List與Set中是否包含某元素的用法。 List的contains()使用(ListCont

Java基礎學習筆記十六 集合框架

first 哈希 cat etag 基於 col 容器 處的 新元素 List List接口的特點: 它是一個元素存取有序的集合。例如,存元素的順序是11、22、33。那麽集合中,元素的存儲就是按照11、22、33的順序完成的。 它是一個帶有索引的集合,通過索引就

Java源碼解析——集合框架——ArrayBlockingQueue

not 結構 AS ray false 元素 模式 -- ins ArrayBlockingQueue源碼解析 ArrayBlockingQueue是一個阻塞式的隊列,繼承自AbstractBlockingQueue,間接的實現了Queue接口和Collection接口

黑馬程式設計師——Java集合框架之迭代器、Collection層次結構等

-----------android培訓、java培訓、java學習型技術部落格、期待與您交流!------------ 集合框架概述 一、什麼是集合框架   1.什麼是集合?   集合是指把具有相同性質的一類東西匯聚成一個整體,簡單說就是指儲存資料的一個容器。集

jdk源碼閱讀筆記之java集合框架LinkedList

ray private array public 源碼閱讀 jdk源碼閱讀 oid color 解釋 關於LinkedList的分析,會從且僅從其添加(add)方法入手。 因為上一篇已經分析過ArrayList,相似的地方就不再敘述,關註點在LinkedList的特點。 屬

淺入深出之Java集合框架

不重復 系統 left 子類 log 兩個 示例 c語言 重要 Java中的集合框架(上) 由於Java中的集合框架的內容比較多,在這裏分為三個部分介紹Java的集合框架,內容是從淺到深,如果已經有java基礎的小夥伴可以直接跳到<淺入深出之Java集合框架(下)&

集合框架

成員 線程 aslist 建議 元素 nds 還得 編譯期 line List的子類(掌握) 1、List的子類特點 ArrayList: 底層數據結構是數組,查詢快,增刪慢 線程不安全,效率高 Vector: 底層數據結構是數組,查詢快,

Java集合框架—— Map、HashMap、Hashtable、Properties、SortedMap、TreeMap、WeakHashMap、IdentityHashMap、EnumMap

getprop color name 找到 文件 remove style 情況 read Map   Map用於保存具有映射關系的數據,因此Map集合裏保存著兩組值,一組值用於保存Map裏的key,另一組值用於保存Map裏的value,key和value

從零寫一個Java WEB框架Server層 優化

該系列,其實是對《架構探險》這本書的實踐。本人想記錄自己的學習心得所寫下的。 從一個簡單的Servlet專案開始起步。對每一層進行優化,然後形成一個輕量級的框架。 每一篇,都是針對專案的不足點進行優化的。 專案已放上github 上一篇地

Java容器框架--ArrayList實現原理

1. 簡介 在Java容器框架(一)--概述篇 中,對ArrayList做了一些簡單的介紹,它在List家族中具有很重要的角色,它的類繼承關係如下: public class ArrayList<E> extends AbstractList<E>

java Restful框架:jersey請求對映和頁面傳值

jersey的webservice開發基本上都是使用註解,接下來學習常用註解. 一.根資源類 [email protected]註解 @Path("/hello") public class HelloWorldController { @G

黑馬程式設計師——Java集合框架之Map集合、CollectionsArrays工具類

-----------android培訓、java培訓、java學習型技術部落格、期待與您交流!------------ Map集合 一、概述 Map集合儲存的元素是鍵值對,即將鍵和值一對一對往裡存,而且要保證鍵的唯一性。  問題思考:   1.如何保證鍵的唯一性?   

java集合框架02——Collection架構原始碼分析

Collection是一個介面,它主要的兩個分支是List和Set。如下圖所示:         List和Set都是介面,它們繼承與Collection。List是有序的佇列,可以用重複的元素;而Set是數學概念中的集合,不能有重複的元素。List和Set都有它們各自

黑馬程式設計師——集合框架 —— Collection

------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">

java集合框架——框架結構及基礎介面

java.util包是一個重要的包,包含許多類和介面,它還包括java的一個功能強大的子系統——集合框架,集合框架是一個複雜接 口和類的層,提供了管理物件組的優化技術。 使用集合框架的目的有幾個,首先