欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java 集合概覽(小結(jié))

 更新時(shí)間:2018年06月26日 09:53:47   作者:Heaven-Wang  
這篇文章主要介紹了Java 集合概覽(小結(jié)),詳細(xì)的介紹了集合的概念和接口等。小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

Java Collection API提供了一些列的類和接口來幫助我們存儲(chǔ)和管理對(duì)象集合。其實(shí)Java中的集合工作起來像是一個(gè)數(shù)組,不過集合的大小是可以動(dòng)態(tài)改變的,而且集合也提供了更多高級(jí)功能。有了JavaCollectionAPI,我們就不需要自己編寫集合類了,大部分Java集合類都位于java.util包里面,還有一些和并發(fā)相關(guān)的集合類位于java.util.concurrent包中。下面就介紹一下Java API 為我們提供的這些集合類。

一、Java 集合概覽

Java中的集合有兩大類,分別是:

1. Collection
2. Map

Collection類的集合可以理解為主要存放的是單個(gè)對(duì)象,而Map類的集合主要存儲(chǔ)的是key-value類型的對(duì)象。這兩大類即可理所當(dāng)然的對(duì)應(yīng)著兩個(gè)接口,分別是Collection接口Map接口,下面這幅圖列出了這兩個(gè)接口的繼承樹:

 

從上面這幅圖可以看到,Collection接口又衍生了出三個(gè)分支,分別是:

1. List
2. Set
3. Queue

而Map則相對(duì)簡單,只有一個(gè)分支。下面我們就詳細(xì)介紹Java Collection的每一個(gè)實(shí)現(xiàn)類。

注意:要把Collection、Collections區(qū)分開,Collection是集合的一個(gè)接口,而Collections是一個(gè)工具類,它提供了一些靜態(tài)方法來方便我們操作集合的實(shí)例,這兩個(gè)都位于java.util包中。

二、先從Collection接口介紹

下圖是Collection接口的源碼截圖,從接口中的抽象方法我們可以看出,它定義了一個(gè)通用集合常用的方法:

- 增加刪除一個(gè)元素
- 判斷元素是否存在
- 獲得集合的大小
- 迭代一個(gè)集合

2.1 Collection的List接口

List接口繼承自Collection接口,它的特點(diǎn)是其中的對(duì)象是有序的,并且每個(gè)對(duì)象都有一個(gè)唯一的index,我們可以通過這個(gè)index來搜索某個(gè)元素,并且List中的對(duì)象允許重復(fù),這類似于一個(gè)數(shù)組。對(duì)于List接口,Java API提供了如下實(shí)現(xiàn):

- java.util.ArrayList
- java.util.LinkedList
- java.util.Vector
- java.util.Stack

當(dāng)然,在 java.util.concurrent包中也有一些實(shí)現(xiàn),這些內(nèi)容會(huì)在另一篇文章中詳細(xì)介紹。

 

ArrayList是最常用的集合,其內(nèi)部實(shí)現(xiàn)是一個(gè)數(shù)組,ArrayList的大小是可以動(dòng)態(tài)擴(kuò)充的。對(duì)于元素的隨機(jī)訪問效率高,其訪問的時(shí)間復(fù)雜度為O(1),對(duì)于數(shù)據(jù)的插入與刪除,從尾部操作效率高,時(shí)間復(fù)雜度和隨機(jī)訪問一樣是O(1),若是從頭部操作則效率會(huì)比較低,因?yàn)閺念^部插入或刪除時(shí)需要移動(dòng)后面所有元素,其時(shí)間復(fù)雜度為O(n-i)(n表示元素個(gè)數(shù),i表示元素位置)。

LinkList:從上圖可以看出,不但繼承了List接口,還繼承了Deque接口(后面會(huì)介紹)。LinkList是一個(gè)基于鏈表的數(shù)據(jù)結(jié)構(gòu),每個(gè)節(jié)點(diǎn)都保存了上一個(gè)和下一個(gè)節(jié)點(diǎn)的指針。LinkList對(duì)于隨機(jī)訪問效率是比較低的,因?yàn)樗枰獜念^開始索引,所以其時(shí)間復(fù)雜度為O(i)。但是對(duì)于元素的增刪,LinkList效率高,因?yàn)橹恍枰薷那昂笾羔樇纯?,其時(shí)間復(fù)雜度為O(1)

 

Vector:從Vector和ArrayList源碼截圖可以看出,它們繼承的接口完全一致。所以,Vector可以看做是一個(gè)線程安全的ArrayList,它內(nèi)部也是基于數(shù)組實(shí)現(xiàn)的,不過幾乎所有的集合操作都加了synchronized關(guān)鍵字。

Stack:上面是Stack類源碼截圖,我們看到Stack類其實(shí)繼承自Vector,Stack只是在Vector的基礎(chǔ)上添加了幾個(gè)方法以提供棧(Last In First Out LIFO)的特性。Stack的特點(diǎn)是添加時(shí)新元素會(huì)被添加到頂部,移除時(shí)頂部的元素最先被移除。這種數(shù)據(jù)結(jié)構(gòu)主要用作一些特殊數(shù)據(jù)加工流程,如語言編譯、XML解析等。

2.2 Collection的Set接口

Set和List接口一樣也是繼承自Collection接口,同樣是對(duì)集合的一種實(shí)現(xiàn),它們之間最大的區(qū)別是Set中的對(duì)象不允許重復(fù)。對(duì)于Set接口,Java API提供了如下實(shí)現(xiàn):

- java.util.EnumSet
- java.util.HashSet
- java.util.LinkedHashSet
- java.util.TreeSet

這些類的功能稍有不同,區(qū)別主要體現(xiàn)在對(duì)象的迭代的順序及插入、查找的效率上。

HashSet的實(shí)現(xiàn)很簡單,其內(nèi)部就是一個(gè)HashMap,不過它對(duì)元素的順序沒有保證。

LinkedHashSet的實(shí)現(xiàn)也很簡單,其內(nèi)部用的是一個(gè)LinkedHashMap。因?yàn)?code>LinkedHashMap內(nèi)部維護(hù)了一個(gè)雙向鏈表以保持順序,所以LinkedHashSet的特點(diǎn)是它當(dāng)中的元素是有序的,元素迭代的順序就是其插入的順序,元素的再次插入不會(huì)影響原有元素的順序。


TreeSet:從上圖的繼承關(guān)系可以看出,想要了解TreeSet就要先了解NavigableSetSortedSet接口。

SortedSet接口

public interface SortedSet<E> extends Set<E> {
   Comparator<? super E> comparator();
   SortedSet<E> subSet(E fromElement, E toElement);
   SortedSet<E> headSet(E toElement);
   SortedSet<E> tailSet(E fromElement);
   E first();  
}

從上面接口定義看,SortedSet接口是Set的一個(gè)子接口,它除了有一般Set的特性之外它元素在內(nèi)部是有序的。它內(nèi)部元素的順序取決于元素的排序規(guī)則,即元素順序取決于元素對(duì)comparable接口的實(shí)現(xiàn)或者一個(gè)comparator比較器,關(guān)于comparable和comparator的區(qū)別,可以參考:http://www.dbjr.com.cn/article/93973.htm

NavigableSet接口

public interface NavigableSet<E> extends SortedSet<E> {
  NavigableSet<E> descendingSet();
  Iterator<E> descendingIterator();
  SortedSet<E> headSet(E toElement);
  SortedSet<E> tailSet(E fromElement);
  SortedSet<E> subSet(E fromElement, E toElement);
  ceiling(), floor(), higher(), and lower()
  ...
}

從NavigableSet接口定義可以看到,它是SortedSet的一個(gè)子接口,并且提供了一些導(dǎo)航方法,至于這些導(dǎo)航方法的含義大家可以查看Java Doc。

所以,TreeSet的特點(diǎn)就是內(nèi)部元素有序,并且有很多導(dǎo)航方法的實(shí)現(xiàn)。從第一部分Java集合類概覽中我們知道,Set有一個(gè)子接口SortedSet,而SortedSet又有一個(gè)子接口NavigableSet接口,Java API對(duì)SortedSet、NavigableSet接口的實(shí)現(xiàn)只有一個(gè),就是TreeSet。

2.3 Collection的Queue接口

Queue接口繼承自Collection接口,它也代表了一個(gè)有序的隊(duì)列,不過這個(gè)隊(duì)列最大的特點(diǎn)就是新插入的元素位于隊(duì)列的尾部,移除的對(duì)象位于隊(duì)列的頭部,這類似于超市中結(jié)賬的隊(duì)列。

我們通過第一節(jié)的Java集合概覽已經(jīng)知道,Queue接口還有一個(gè)子接口Deque,下面我們分別看一下JavaAPI對(duì)這兩個(gè)接口的定義:

Queue接口:

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

Deque接口:

public interface Deque<E> extends Queue<E> {
  void addFirst(E e);
  void addLast(E e);
  E removeFirst(); 
  E removeFirst();
}

從這兩個(gè)接口的定義我想大家已經(jīng)看出些端倪,Queue接口定義了一般隊(duì)列的操作方式,而Deque則是一個(gè)雙端隊(duì)列。

對(duì)于Queue接口,Java API提供了兩個(gè)實(shí)現(xiàn):

- java.util.LinkedList(也實(shí)現(xiàn)了Deque接口)
- java.util.PriorityQueue

LinkedList:前面的List章節(jié)已經(jīng)提到,它是一個(gè)標(biāo)準(zhǔn)隊(duì)列。
PriorityQueue:隊(duì)列中的順序類似于TreeSet,取決于元素的排序規(guī)則,即元素對(duì)comparable接口的實(shí)現(xiàn)或者一個(gè)comparator比較器。

對(duì)于Deque接口,出了LinkList類之外還有一個(gè)實(shí)現(xiàn):

- java.util.ArrayDeque

ArrayDeque:從名稱可以看出,其內(nèi)部實(shí)現(xiàn)是一個(gè)數(shù)組。

三、Java 集合之 Map

從第一部分Java集合類概覽中我們知道,Map不是繼承自Collection接口,而是和Collection接口出于并列的位置。所以,Map的行為和上面介紹的Collection的行為由很大不同。Map的主要特點(diǎn)是它存放的元素為key-value對(duì),我們看一下Map接口的定義:

public interface Map<K,V> {
  V put(K key, V value);
  boolean containsKey(Object key);
  Set<Map.Entry<K, V>> entrySet();
  int hashCode(); V get(Object key);
  Set<K> keySet();
  ... ...
}

對(duì)于Map接口,Java API提供了如下實(shí)現(xiàn):

- java.util.HashMap
- java.util.Hashtable
- java.util.EnumMap
- java.util.IdentityHashMap
- java.util.LinkedHashMap
- java.util.Properties
- java.util.TreeMap
- java.util.WeakHashMap

其中,我們最常用到的是HashMap和TreeMap。

HashMap中的key、value都是無序的。HashMap的內(nèi)部實(shí)現(xiàn)非常值得研究,具體請(qǐng)參考HashMap內(nèi)部實(shí)現(xiàn)

HashTable可以看做是HashMap的重量級(jí)實(shí)現(xiàn),其中的大部分方法都加了synchronized關(guān)鍵字,是線程安全的。HashTable與HashMap的另一個(gè)區(qū)別是HashMap的key-value都允許為null,而HashTable不可以。

LinkedHashMap也是一個(gè)HashMap,只是內(nèi)部維護(hù)了一個(gè)雙向鏈表以保持順序,LinkedHashSet內(nèi)部實(shí)現(xiàn)就是用的LinkedHashMap。

TreeMap中的key、value不但可以保持順序,類似于TreeSetPriorityQueue,TreeMap中key、value的迭代順序取決于它們各自的排序規(guī)則。

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot入口類和@SpringBootApplication講解

    SpringBoot入口類和@SpringBootApplication講解

    這篇文章主要介紹了SpringBoot入口類和@SpringBootApplication講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • java中常見的中文亂碼總結(jié)

    java中常見的中文亂碼總結(jié)

    本文主要介紹了java中常見的中文亂碼以及解決方法,主要包括字節(jié)碼文件讀取時(shí)出現(xiàn)的亂碼問題,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有很好的參考價(jià)值,感興趣的朋友跟隨小編一起看看吧
    2017-03-03
  • javaWeb連接數(shù)據(jù)庫實(shí)現(xiàn)簡單登陸注冊(cè)功能的全過程

    javaWeb連接數(shù)據(jù)庫實(shí)現(xiàn)簡單登陸注冊(cè)功能的全過程

    初學(xué)javaWeb,老師留下一小作業(yè),用JAVA實(shí)現(xiàn)與服務(wù)器端交互,實(shí)現(xiàn)登錄和注冊(cè)功能,下面這篇文章主要給大家介紹了關(guān)于javaWeb連接數(shù)據(jù)庫實(shí)現(xiàn)簡單登陸注冊(cè)功能的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • 解析ConcurrentHashMap: put方法源碼分析

    解析ConcurrentHashMap: put方法源碼分析

    ConcurrentHashMap是由Segment數(shù)組結(jié)構(gòu)和HashEntry數(shù)組結(jié)構(gòu)組成。Segment的結(jié)構(gòu)和HashMap類似,是一種數(shù)組和鏈表結(jié)構(gòu),今天給大家普及java面試常見問題---ConcurrentHashMap知識(shí),一起看看吧
    2021-06-06
  • Java使用synchronized實(shí)現(xiàn)互斥鎖功能示例

    Java使用synchronized實(shí)現(xiàn)互斥鎖功能示例

    這篇文章主要介紹了Java使用synchronized實(shí)現(xiàn)互斥鎖功能,結(jié)合實(shí)例形式分析了Java使用synchronized互斥鎖功能簡單實(shí)現(xiàn)方法與操作技巧,需要的朋友可以參考下
    2020-05-05
  • 如何解決hibernate一對(duì)多注解懶加載失效問題

    如何解決hibernate一對(duì)多注解懶加載失效問題

    這篇文章主要介紹了解決hibernate一對(duì)多注解懶加載失效的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java數(shù)據(jù)結(jié)構(gòu)之AC自動(dòng)機(jī)算法的實(shí)現(xiàn)

    Java數(shù)據(jù)結(jié)構(gòu)之AC自動(dòng)機(jī)算法的實(shí)現(xiàn)

    AC自動(dòng)機(jī)算法常被認(rèn)為是Trie樹+KMP算法的結(jié)合體,它是一個(gè)多模式匹配算法,在模式匹配領(lǐng)域被廣泛應(yīng)用。本文將詳細(xì)為大家介紹AC自動(dòng)機(jī)的原理與實(shí)現(xiàn)方法,感興趣的可以了解一下
    2022-12-12
  • Java 求解如何把二叉搜索樹轉(zhuǎn)換為累加樹

    Java 求解如何把二叉搜索樹轉(zhuǎn)換為累加樹

    這篇文章主要介紹了Java 求解把二叉搜索樹轉(zhuǎn)換為累加樹的代碼,總之需要觀察示例節(jié)點(diǎn)的規(guī)律,需要記錄上個(gè)節(jié)點(diǎn)的情況,注意引入前驅(qū)節(jié)點(diǎn)pre,具體實(shí)例代碼跟隨小編一起看看吧
    2021-11-11
  • Mybatis 級(jí)聯(lián)刪除的實(shí)現(xiàn)

    Mybatis 級(jí)聯(lián)刪除的實(shí)現(xiàn)

    這篇文章主要介紹了Mybatis 級(jí)聯(lián)刪除的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • java實(shí)現(xiàn)文件夾解壓和壓縮

    java實(shí)現(xiàn)文件夾解壓和壓縮

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)文件夾解壓和壓縮,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03

最新評(píng)論