我們知道,List是Java編程中經(jīng)常使用的集合之一,但List到底有哪些不為人知的地方,List為什么被使用的這么多?今天千鋒就為大家分析一下關(guān)于List的那點(diǎn)事兒。
List本身其實(shí)是一個(gè)接口,繼承自Collection接口,所以List存儲(chǔ)元素的特點(diǎn)是單元素,區(qū)別于Map(雙元素集合),JDK8為L(zhǎng)ist接口提供了10個(gè)實(shí)現(xiàn)類,供開發(fā)人員使用。為什么提供那么多的實(shí)現(xiàn)類呢?因?yàn)樵趯?shí)際開發(fā)場(chǎng)景下需要根據(jù)業(yè)務(wù)的不同選擇不同的實(shí)現(xiàn)類來使用,這就要求大家對(duì)實(shí)現(xiàn)類的特點(diǎn)都要加以掌握,才能再實(shí)際的開發(fā)中運(yùn)用自如。有些菜鳥一個(gè)ArrayList走天下^!^。大家可以先看看下面我總結(jié)的List子類圖:
接下來我會(huì)給大家對(duì)以上幾個(gè)類進(jìn)行簡(jiǎn)要介紹。
從源碼中可以看到,這個(gè)類是抽象類無法進(jìn)行實(shí)例化。該類實(shí)現(xiàn)了迭代器和列表迭代器,同時(shí)也實(shí)現(xiàn)了get(int),set(int, E),add(int, E),remove(int)方法,如果子類有更好的處理方式可以覆蓋這些方法。
此抽象類實(shí)現(xiàn)由連續(xù)訪問數(shù)據(jù)存儲(chǔ)所需的工作(如鏈表),它實(shí)現(xiàn)了對(duì)列表的列表迭代器頂部的隨機(jī)訪問方法get(int),set(int index,E element),add(int index,E element)和remove(int index)
此類為主要實(shí)現(xiàn)類之一,實(shí)際開發(fā)過程中經(jīng)常使用。主要完成可調(diào)整大小的集合(基于數(shù)組實(shí)現(xiàn)),每個(gè)ArrayList實(shí)例都有一個(gè)容量。容量是用于存儲(chǔ)列表中的元素的數(shù)組大小。請(qǐng)注意此實(shí)現(xiàn)線程不安全。
此類是ArryList的子類,是對(duì)ArrayList的擴(kuò)展。表示MBean屬性值的列表(MBean參見jdk官方文檔)
此類是一個(gè)線程安全的變體ArrayList,其中所有可變操作(add,set,remove等等)通過對(duì)底層數(shù)組的最新副本實(shí)現(xiàn)。在多線程情況下使用較頻繁
此類基于雙向鏈表實(shí)現(xiàn)List接口。實(shí)現(xiàn)所有可選列表操作,并允許所有元素(包括null)。請(qǐng)注意,此實(shí)現(xiàn)不同步。
RoleList表示角色列表(Role對(duì)象)。在創(chuàng)建關(guān)系時(shí)用作參數(shù),并且嘗試在關(guān)系中設(shè)置多個(gè)角色。
RoleUnresolvedList表示RoleUnresolved對(duì)象的列表,表示由于在嘗試訪問(讀取或?qū)懭?角色時(shí)遇到問題,不會(huì)從關(guān)系中檢索到角色。
Stack類代表最先進(jìn)先出(LIFO)堆棧的對(duì)象。 它擴(kuò)展了類別Vector與五個(gè)操作,允許一個(gè)向量被視為堆棧。 設(shè)置在通常的push和pop操作,以及作為一種方法來peek在堆棧,以測(cè)試堆棧是否為empty的方法,以及向search在棧中的項(xiàng)目的方法在頂部項(xiàng)目和發(fā)現(xiàn)多遠(yuǎn)它是從頂部。
當(dāng)首次創(chuàng)建堆棧時(shí),它不包含任何項(xiàng)目
此類實(shí)現(xiàn)了可擴(kuò)展的對(duì)象數(shù)組。 像數(shù)組一樣,它包含可以使用整數(shù)索引訪問的組件。 但是, Vector的大小可以根據(jù)需要增長(zhǎng)或縮小,以適應(yīng)在創(chuàng)建之后添加和刪除項(xiàng)目。因操作速度較慢,故基本不適用,但卻是線程安全,建議使用ArrayList代替Vector。
好了,以上就是千鋒給大家分析的List基本內(nèi)容,現(xiàn)在你對(duì)List的認(rèn)識(shí)是不是更深刻了呢?