麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 編程 > Java > 正文

Java 容器相關(guān)知識(shí)全面總結(jié)

2019-11-11 06:50:54
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

學(xué)習(xí)java的同學(xué)注意了?。?! 學(xué)習(xí)過(guò)程中遇到什么問(wèn)題或者想獲取學(xué)習(xí)資源的話,歡迎加入Java學(xué)習(xí)交流群,群號(hào)碼:183993990  我們一起學(xué)Java!

Java實(shí)用類(lèi)庫(kù)提供了一套相當(dāng)完整的容器來(lái)幫助我們解決很多具體問(wèn)題。因?yàn)槲冶旧硎且幻鸄ndroid開(kāi)發(fā)者,包括我在內(nèi)很多安卓開(kāi)發(fā),最拿手的就是ListView(RecycleView)+BaseAdapter+ArrayList三劍客, 平時(shí)接觸使用的容器也只有ArrayList和HashMap。導(dǎo)致對(duì)于整個(gè)Java容器體系的掌握和使用還停留在很淺的層面。省不足而思改進(jìn),那么跟著我來(lái)總結(jié)一下Java容器的相關(guān)知識(shí)吧。

結(jié)構(gòu)

java容器類(lèi)的繼承結(jié)構(gòu)具體介紹迭代器CollectionListSetQueueMap一些建議進(jìn)階·并發(fā)容器CopyOnWriteArrayList與Copy-On-Write策略ConcurrentLinkedQueueConcurrentHashMap與鎖分段技術(shù)阻塞隊(duì)列

java容器類(lèi)的繼承結(jié)構(gòu)

Java容器類(lèi)庫(kù)定義了兩個(gè)不同概念的容器,Collection和Map

Collection 一個(gè)獨(dú)立元素的序列,這些元素都服從一條或多條規(guī)則。List必須按照插入的順序保存元素。Set不能有重復(fù)元素。Queue按照排隊(duì)規(guī)則來(lái)確定對(duì)象產(chǎn)生的順序。

(文中Jdk源碼版本無(wú)特殊說(shuō)明均為jdk1.8.0_101)

    public interface Collection<E> extends Iterable<E> {        int size();        boolean isEmpty();        boolean contains(Object o);        Iterator<E> iterator();        Object[] toArray();        <T> T[] toArray(T[] a);        boolean add(E e);        boolean remove(Object o);        boolean containsAll(java.util.Collection<?> c);        boolean addAll(java.util.Collection<? extends E> c);        boolean removeAll(java.util.Collection<?> c);        ... //省略了其他方法    }

可以看到,java定義了Collection接口和內(nèi)部集合的基本操作方法,Collection默認(rèn)可以進(jìn)行對(duì)集合末端添加元素,刪除指定元素等操作。List、Set、Queue接口都繼承自Collection并定義了各自不同的方法。

Map 一組成對(duì)的”鍵值對(duì)”對(duì)象,允許我們使用鍵來(lái)查找值。

    public interface Map<K,V> {        int size();        boolean containsKey(Object key);        boolean containsValue(Object value);        V get(Object key);        V put(K key, V value);        V remove(Object key);        void putAll(java.util.Map<? extends K, ? extends V> m);        void clear();        Set<K> keySet();        Collection<V> values();        Set<java.util.Map.Entry<K, V>> entrySet();        interface Entry<K,V> {            K getKey();            V getValue();            V setValue(V value);            boolean equals(Object o);            int hashCode();            ...        }        boolean equals(Object o);        int hashCode();    }

Map內(nèi)部接口Entry<K,V>對(duì)應(yīng)著Map的鍵值對(duì)。

具體介紹

迭代器

先介紹一下迭代器。迭代器本身也是一種設(shè)計(jì)模式,設(shè)計(jì)的初衷在于:容器的實(shí)現(xiàn)由很多種,而我們想對(duì)容器進(jìn)行遍歷操作的話,首先不應(yīng)該關(guān)心容器實(shí)現(xiàn)的細(xì)節(jié),其次遍歷操作應(yīng)該是輕量級(jí)的。迭代器統(tǒng)一了對(duì)容器的訪問(wèn)方式,同時(shí)創(chuàng)建它的代價(jià)很小。值得注意的是,Iterator只能單向移動(dòng)。

    public interface Iterator<E> {        boolean hasNext();        E next();        default void remove() {            throw new UnsupportedOperationException("remove");        }        default void forEachRemaining(Consumer<? super E> action) {            Objects.requireNonNull(action);            while (hasNext())                action.accept(next());            }    }

通過(guò)容器的iterator()方法拿到容器的迭代器迭代器的next()獲取下一個(gè)元素hasNext()判斷是否還有元素remove()刪除指定元素

ListIterator

ListIterator是Iterator的擴(kuò)展之內(nèi),用于各種List類(lèi)訪問(wèn),支持雙向移動(dòng)。

Collection

List

List 承諾可以將元素維護(hù)在特定的序列中.List接口在Collection的基礎(chǔ)上添加了大量的方法,使得可以再List中間插入和移除元素。

    public interface List<E> extends Collection<E> {        ...        boolean add(E e);        boolean remove(Object o);        boolean containsAll(Collection<?> c);        boolean addAll(Collection<? extends E> c);        boolean addAll(int index, Collection<? extends E> c);        boolean removeAll(Collection<?> c);        boolean retainAll(Collection<?> c);        E get(int index);        E set(int index, E element);        void add(int index, E element);        E remove(int index);        int indexOf(Object o);        int lastIndexOf(Object o);        java.util.List<E> subList(int fromIndex, int toIndex);        ...    }

有兩種類(lèi)型的List,ArrayList和LinkedList

List類(lèi)型優(yōu)點(diǎn)缺點(diǎn)底層實(shí)現(xiàn)
ArrayList隨機(jī)訪問(wèn)元素較快中間元素的插入和刪除較慢數(shù)組
LinkedList中間元素的插入和刪除,順序訪問(wèn)的優(yōu)化隨機(jī)訪問(wèn)元素較慢雙向鏈表

Set

Set不保存重復(fù)的元素,通常用于快速查找元素。值得一提的是,Set具有與Collection完全一樣的接口,沒(méi)有任何額外的功能。 存入的元素必須定義equals()方法

Set類(lèi)型使用場(chǎng)景底層實(shí)現(xiàn)
HashSet快速查找,元素必須定義hashCode()鏈表
TreeSet保持次序,元素必須實(shí)現(xiàn)Comparable接口紅-黑樹(shù)結(jié)構(gòu)
LinkedHashSet維護(hù)次序的HashSet, 元素必須定義hashCode()鏈表

Queue

除了并發(fā)應(yīng)用,Queue僅有的兩個(gè)實(shí)現(xiàn)是LinkedList和PRiorityQueue, 其中LinkedList同時(shí)實(shí)現(xiàn)了List, Deque接口。它們的差異在于排序行為而不是性能。

    public interface Queue<E> extends Collection<E> {        boolean add(E e);        boolean offer(E e);        E remove();        E poll();        E element();        E peek();    }

Map

Map類(lèi)型使用場(chǎng)景底層實(shí)現(xiàn)
HashMap快速查詢散列表
LinkedHashMap迭代遍歷具有順序(插入順序 or 最近最少使用)鏈表
TreeMap具有排序,唯一可以返回子樹(shù)的Map(subMap())紅-黑樹(shù)結(jié)構(gòu)
WeakHashMap弱鍵映射,映射之外無(wú)引用的鍵,可以被垃圾回收散列表
ConcurrentHashMap線程安全的Map鏈表
IdentityHashMap使用==代替equals()對(duì)鍵進(jìn)行排序,專位解決特殊問(wèn)題鏈表

我們可以手工調(diào)整HashMap來(lái)調(diào)整性能,涉及到如容量、初始容量、尺寸、負(fù)載因子等概念。感興趣的話可以看一些相關(guān)資料。

一些建議

不要使用過(guò)時(shí)的容器 如Vector Enumeration Hashtable Stack(沒(méi)錯(cuò),這就是java最初的糟糕設(shè)計(jì),實(shí)際中使用棧的話推薦LinkedList)

進(jìn)階·并發(fā)容器

這里不會(huì)討論的太細(xì)致的實(shí)現(xiàn),僅僅簡(jiǎn)單介紹一下基礎(chǔ)知識(shí),感興趣的可以閱讀《Java 并發(fā)編程的藝術(shù)》這本書(shū)。

CopyOnWriteArrayList與Copy-On-Write策略

Copy-On-Write簡(jiǎn)稱COW,是一種用于程序設(shè)計(jì)中的優(yōu)化策略。其基本思路是,從一開(kāi)始大家都在共享同一個(gè)內(nèi)容,當(dāng)某個(gè)人想要修改這個(gè)內(nèi)容的時(shí)候,才會(huì)真正把內(nèi)容Copy出去形成一個(gè)新的內(nèi)容然后再改,這是一種延時(shí)懶惰策略。從JDK1.5開(kāi)始Java并發(fā)包里提供了兩個(gè)使用CopyOnWrite機(jī)制實(shí)現(xiàn)的并發(fā)容器,它們是CopyOnWriteArrayList和CopyOnWriteArraySet。CopyOnWrite容器非常有用,可以在非常多的并發(fā)場(chǎng)景中使用到。

CopyOnWrite容器即寫(xiě)時(shí)復(fù)制的容器。通俗的理解是當(dāng)我們往一個(gè)容器添加元素的時(shí)候,不直接往當(dāng)前容器添加,而是先將當(dāng)前容器進(jìn)行Copy,復(fù)制出一個(gè)新的容器,然后新的容器里添加元素,添加完元素之后,再將原容器的引用指向新的容器。這樣做的好處是我們可以對(duì)CopyOnWrite容器進(jìn)行并發(fā)的讀,而不需要加鎖,因?yàn)楫?dāng)前容器不會(huì)添加任何元素。所以CopyOnWrite容器也是一種讀寫(xiě)分離的思想,讀和寫(xiě)不同的容器。

CopyOnWrite容器只能保證數(shù)據(jù)的最終一致性,不能保證數(shù)據(jù)的實(shí)時(shí)一致性。所以如果你希望寫(xiě)入的的數(shù)據(jù),馬上能讀到,請(qǐng)不要使用CopyOnWrite容器。

ConcurrentLinkedQueue

在并發(fā)編程中,有時(shí)候需要使用線程安全的隊(duì)列或列表。通常實(shí)現(xiàn)線程安全有兩種方式,一種是使用阻塞算法,一種是使用非阻塞算法。非阻塞算法實(shí)現(xiàn)基礎(chǔ)為循環(huán)CAS(Compare and Swipe 比較和交換)。

ConcurrentLinkedQueue技術(shù)上的實(shí)現(xiàn)與CopyOnWriteArrayList與Copy類(lèi)似,但是容器只有部分內(nèi)容而不是整個(gè)容器可以被復(fù)制和修改。ConcurrentLinkedQueue有head節(jié)點(diǎn)和tail節(jié)點(diǎn)組成,每個(gè)節(jié)點(diǎn)由節(jié)點(diǎn)元素(item)和指向下一個(gè)結(jié)點(diǎn)(next)的引用組成。節(jié)點(diǎn)之間通過(guò)next關(guān)聯(lián)起來(lái),形成一張鏈表結(jié)構(gòu)的隊(duì)列。

ConcurrentHashMap與鎖分段技術(shù)

ConcurrentHashMap是線程安全且高效的HashMap。多線程環(huán)境下,使用非線程安全的HashMap會(huì)導(dǎo)致死循環(huán),而如文章中建議的那樣,HashTable這種過(guò)時(shí)容器效率低下(使用synchronized來(lái)保證線程安全)。ConcurrentHashMap使用鎖分段技術(shù),大大提高了并發(fā)使用的效率。

鎖分段技術(shù): 假設(shè)容器有多把鎖,每一把鎖用于鎖容器其中一部分?jǐn)?shù)據(jù),當(dāng)多線程訪問(wèn)容器不同數(shù)據(jù)段數(shù)據(jù)時(shí),線程間就不存在鎖競(jìng)爭(zhēng),從而提高并發(fā)訪問(wèn)效率。

阻塞隊(duì)列

JDK7 提供了7個(gè)阻塞隊(duì)列,實(shí)現(xiàn)原理都是基于生產(chǎn)-消費(fèi)模式的等待通知機(jī)制。

阻塞隊(duì)列類(lèi)型特點(diǎn)
ArrayBlockingQueue由數(shù)組結(jié)構(gòu)組成的有界阻塞隊(duì)列
LinkedBlockingQueue由鏈表結(jié)構(gòu)組成的有界阻塞隊(duì)列
PriorityBlockingQueue支持優(yōu)先級(jí)排序的無(wú)界阻塞隊(duì)列
DelayQueue使用優(yōu)先級(jí)隊(duì)列實(shí)現(xiàn)的無(wú)界阻塞隊(duì)列
SynchronousQueue不儲(chǔ)存元素的阻塞隊(duì)列
LinkedTransferQueue由鏈表結(jié)構(gòu)組成的無(wú)界阻塞隊(duì)列
LinkedBlockingQueue由鏈表結(jié)構(gòu)組成的雙向阻塞隊(duì)列

學(xué)習(xí)Java的同學(xué)注意了?。。?nbsp;學(xué)習(xí)過(guò)程中遇到什么問(wèn)題或者想獲取學(xué)習(xí)資源的話,歡迎加入Java學(xué)習(xí)交流群,群號(hào)碼:183993990  我們一起學(xué)Java!


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 国产不卡av在线 | 成人爽a毛片免费啪啪红桃视频 | 视频一区二区在线观看 | 国产午夜电影 | 超污视频在线看 | 欧美精品在线免费观看 | 精精国产xxxx视频在线播放7 | 免费久久精品 | 国产成人精品免费视频大全办公室 | 久久爽精品区穿丝袜 | 97超视频在线观看 | 国产午夜精品一区二区三区四区 | 久久午夜神器 | 国产人成精品综合欧美成人 | 福利在线免费视频 | 一级黄色免费观看视频 | 国产精品久久久久久久久久久久午夜 | 精品在线观看一区二区三区 | 欧美成人黄色小视频 | 国产美女爽到喷白浆的 | wwwcom国产| 精品国产乱码久久久久久丨区2区 | 怦然心动50免费完整版 | 久国产精品视频 | 国产一级一片免费播放 | 狠狠干五月天 | 免费色片| 欧美精品成人一区二区在线观看 | 亚洲最大的成人网 | 91美女视频在线观看 | 国产一区二区三区在线免费 | 中文在线国产 | 色97色| 午夜激情视频免费 | 欧美区在线 | www.91pron| 欧美a视频在线观看 | 国产精品久久久久久久av | 一级毛片免费高清 | 一级免费黄色免费片 | 久久久久av69精品 |