集合總論

Collection接口

Collection接口是所有集合的祖先類厉斟。他有兩個構(gòu)造方法买羞,一個無參構(gòu)造矗愧,一個是帶Collection參數(shù)的構(gòu)造函數(shù)。同時Collection還繼承了Iterable接口麦箍,所以集合類都可以使用迭代器進行遍歷。


特點:

1. Linked開頭的適合快速插入,刪除元素, linked維護元素插入的次序

2. Set 在 HashMap 的基礎(chǔ)上實現(xiàn), 所以Set結(jié)尾的key是不會重復(fù)的

3. Tree開頭的是每次改變發(fā)生排序的, 速度慢

Iterable

Iterable接口有一個iterator變量陶珠,實現(xiàn)該接口的對象可以使用“for-each ”循環(huán)挟裂,進行遍歷。該對象有兩個方法揍诽,一個是遍歷時使用的forEach方法诀蓉,還有一個方法是spliterator方法栗竖,該方法返回一個Spliterator對象,該對象也是遍歷的對象渠啤,相對于iteratot狐肢,他是為了并行遍歷數(shù)據(jù)源中的數(shù)據(jù)而設(shè)計的。

List

List接口實現(xiàn)了Collection接口埃篓,其中有一些方法如下:

ArrayList和LinkedList區(qū)別

1.對ArrayList和LinkedList而言处坪,在列表末尾增加一個元素所花的開銷都是固定的。對ArrayList而言架专,主要是在內(nèi)部數(shù)組中增加一項同窘,指向所添加的元素,偶爾可能會導(dǎo)致對數(shù)組重新進行分配部脚;而對LinkedList而言想邦,這個開銷是統(tǒng)一的,分配一個內(nèi)部Entry對象委刘。

2.在ArrayList的中間插入或刪除一個元素意味著這個列表中剩余的元素都會被移動丧没;而在LinkedList的中間插入或刪除一個元素的開銷是固定的。

3.LinkedList不支持高效的隨機元素訪問锡移。

4.ArrayList的空間浪費主要體現(xiàn)在在list列表的結(jié)尾預(yù)留一定的容量空間呕童,而LinkedList的空間花費則體現(xiàn)在它的每一個元素都需要消耗相當(dāng)?shù)目臻g。


ArrayList

實現(xiàn)的接口和類:ArrayList繼承了AbstractList類淆珊,實現(xiàn)了List接口夺饲,RandomAccess接口,Cloneable接口施符,java.io.Serializable接口往声。

其中AbstractList類:提供 List 接口的骨干實現(xiàn),從而最大限度地減少了實現(xiàn)由“隨機訪問”數(shù)據(jù)存儲(如數(shù)組)支持的接口所需的工作戳吝。

RandomAccess接口: List(隨機訪問列表)要實現(xiàn)此接口浩销,而順序訪問不需要實現(xiàn)該接口。RandmoAccess是java中用來被List實現(xiàn)听哭,為List提供快速訪問功能的慢洋。在ArrayList中,我們即可以通過元素的序號快速獲取元素對象欢唾;這就是快速隨機訪問且警。

Cloneable接口:所有類若要使用clone方法必須要實現(xiàn)Clonneable接口,但是這個空接口礁遣,以達到標(biāo)記的作用斑芜,不然會報CloneNotSupportedException

java.io.Serializable接口:表示序列化,是一個空接口祟霍。序列化杏头,用在將對象編碼成字節(jié)流(序列化)及從字節(jié)流編碼重構(gòu)對象(反序列化)盈包。序列化 ? 為遠(yuǎn)程通信提供了標(biāo)準(zhǔn)的wire-level協(xié)議。

ArrayList是一個數(shù)組存儲結(jié)構(gòu)醇王,相當(dāng)于動態(tài)的數(shù)組呢燥。與真實的數(shù)組比較,他的容量能夠動態(tài)增長寓娩,和Vector不同叛氨,ArrayList中的操作不是線程安全的!所以棘伴,建議在單線程中才使用ArrayList寞埠,而在多線程中可以選擇Vector或者CopyOnWriteArrayList

ArrayList構(gòu)造方法

ArrayList(int initialCapacity)? 創(chuàng)建指定大小的集合

ArrayList()?? 創(chuàng)建默認(rèn)的list集合

ArrayList(Collection c) 創(chuàng)建以指定集合為模板的一個集合。

ArrayList自己的API

void? ensureCapacity(int minimumCapacity) 如果要增加的數(shù)據(jù)量很大焊夸,應(yīng)該使用ensureCapacity()方法仁连,該方法的作用是預(yù)先設(shè)置Arraylist的大小,這樣可以大大提高初始化速度阱穗。

void?? trimToSize() 刪除預(yù)留的空間

void?? removeRange(int fromIndex, int toIndex) 刪除一定范圍的元素

ArrayList包含了兩個重要的對象:elementData 和 size饭冬。

(01)?elementData?是"Object[]類型的數(shù)組",它保存了添加到ArrayList中的元素揪阶。實際上昌抠,elementData是個動態(tài)數(shù)組,我們能通過構(gòu)造函數(shù) ArrayList(int initialCapacity)來執(zhí)行它的初始容量為initialCapacity鲁僚;如果通過不含參數(shù)的構(gòu)造函數(shù)ArrayList()來創(chuàng)建ArrayList扰魂,則elementData的容量默認(rèn)是10。elementData數(shù)組的大小會根據(jù)ArrayList容量的增長而動態(tài)的增長蕴茴,具體的增長方式,請參考源碼分析中的ensureCapacity()函數(shù)姐直。

(02)?size?則是動態(tài)數(shù)組的實際大小倦淀。

ArrayList特點

(01) ArrayList 實際上是通過一個數(shù)組去保存數(shù)據(jù)的。當(dāng)我們構(gòu)造ArrayList時声畏;若使用默認(rèn)構(gòu)造函數(shù)撞叽,則ArrayList的默認(rèn)容量大小是10。

(02) 當(dāng)ArrayList容量不足以容納全部元素時插龄,ArrayList會重新設(shè)置容量:新的容量=“(原始容量x3)/2 + 1”愿棋。

(03) ArrayList的克隆函數(shù),即是將全部元素克隆到一個數(shù)組中均牢。

(04) ArrayList實現(xiàn)java.io.Serializable的方式糠雨。當(dāng)寫入到輸出流時,先寫入“容量”徘跪,再依次寫入“每一個元素”甘邀;當(dāng)讀出輸入流時琅攘,先讀取“容量”,再依次讀取“每一個元素”松邪。

ArrayList的遍歷方式

(01) 第一種坞琴,通過迭代器遍歷。即通過Iterator去遍歷逗抑。

Integer value = null;

Iterator iter = list.iterator();

while (iter.hasNext()) {

value = (Integer)iter.next();

}

(02) 第二種剧辐,隨機訪問,通過索引值去遍歷邮府。

由于ArrayList實現(xiàn)了RandomAccess接口荧关,它支持通過索引值去隨機訪問元素。

Integer value = null;

int size = list.size();

for (int i=0; i<size;i++){

value=(Integer)list.get(i);

}

(03) 第三種挟纱,for循環(huán)遍歷羞酗。如下:

Integer value = null;

for (Integer integ:list) {

value = integ;

}

遍歷時,通過索引值去遍歷的效率最高紊服,使用迭代器的效率最低檀轨。

toArray()異常

當(dāng)我們調(diào)用ArrayList中的 toArray(),可能遇到過拋出“java.lang.ClassCastException”異常的情況欺嗤。下面我們說說這是怎么回事参萄。

ArrayList提供了2個toArray()函數(shù):

Object[] toArray()

T[] toArray(T[] contents)

調(diào)用 toArray() 函數(shù)會拋出“java.lang.ClassCastException”異常,但是調(diào)用 toArray(T[] contents) 能正常返回 T[]煎饼。toArray() 會拋出異常是因為 toArray() 返回的是 Object[] 數(shù)組讹挎,將 Object[] 轉(zhuǎn)換為其它類型(如,將Object[]轉(zhuǎn)換為的Integer[])則會拋出“java.lang.ClassCastException”異常吆玖,因為Java不支持向下轉(zhuǎn)型筒溃。解決該問題的辦法是調(diào)用T[] toArray(T[] contents) , 而不是 Object[] toArray()沾乘。

調(diào)用 toArray(T[] contents) 返回T[]的可以通過以下幾種方式實現(xiàn)怜奖。

public static Integer[] vectorToArray1(ArrayListv) {?

? Integer[] newText = new Integer[v.size()];?

? v.toArray(newText);? ? r

eturn newText;}

// toArray(T[] contents)調(diào)用方式二。最常用翅阵!

public static Integer[] vectorToArray2(ArrayListv) {?

? Integer[] newText = (Integer[])

v.toArray(new Integer[0]);? ?

return newText;}

// toArray(T[] contents)調(diào)用方式三

public static Integer[] vectorToArray3(ArrayListv) {

Integer[] newText = new Integer[v.size()];

Integer[] newStrings = (Integer[])v.toArray(newText);

return newStrings;

}


ListIterator

在使用List歪玲、ArrayList、LinkedList和Vector的時候可以使用掷匠。

與普通迭代器的比較

一.相同點

都是迭代器滥崩,當(dāng)需要對集合中元素進行遍歷不需要干涉其遍歷過程時,這兩種迭代器都可以使用讹语。

二.不同點

1.使用范圍不同钙皮,Iterator可以應(yīng)用于所有的集合,Set、List和Map和這些集合的子類型株灸。而ListIterator只能用于List及其子類型崇摄。

2.ListIterator有add方法,可以向List中添加對象慌烧,而Iterator不能逐抑。

3.ListIterator和Iterator都有hasNext()和next()方法,可以實現(xiàn)順序向后遍歷屹蚊,但是ListIterator有hasPrevious()和previous()方法厕氨,可以實現(xiàn)逆向(順序向前)遍歷。Iterator不可以汹粤。

4.ListIterator可以定位當(dāng)前索引的位置命斧,nextIndex()和previousIndex()可以實現(xiàn)。Iterator沒有此功能嘱兼。

5.都可實現(xiàn)刪除操作国葬,但是ListIterator可以實現(xiàn)對象的修改,set()方法可以實現(xiàn)芹壕。Iterator僅能遍歷汇四,不能修改。

LinkedList

LinkedList繼承了AbstractSequentialist類踢涌,實現(xiàn)了List接口通孽,Deque接口,Cloneable接口睁壁,java.io.Serializable接口

Deque接口:實現(xiàn)隊列的接口

LinkedList類是雙向列表,列表中的每個節(jié)點都包含了對前一個和后一個元素的引用.

LinkedList的構(gòu)造函數(shù)如下

1. public LinkedList(): ?——生成空的鏈表

2. public LinkedList(Collection col): ?復(fù)制構(gòu)造函數(shù)

方法:

subList(1背苦,4) 從下標(biāo)為1的后面4個元素生成子表

add()? 添加元素,默認(rèn)到鏈表最后潘明,也可以指定位置

addFirst()

addLast()

removeFirst()

removeLast()

clear()

toArray()

set()

add()

cotains()

使用鏈表實現(xiàn)棧效果

class StackL {

private LinkedList list = new LinkedList();

public void push(Object v) {

list.addFirst(v);

}

public Object top() {

return list.getFirst();

}

public Object pop() {

return list.removeFirst();

}

使用鏈表實現(xiàn)隊列效果

class Queue {

private LinkedList list = new LinkedList();

public void put(Object v) {

list.addFirst(v);

}

public Object get() {

return list.removeLast();

}

public boolean isEmpty() {

return list.isEmpty();

}

Vector

Vector繼承了AbstractList行剂,實現(xiàn)了List,它是一個隊列钳降,因此實現(xiàn)了相應(yīng)的添加硼讽、刪除、修改牲阁、遍歷等功能。

Vector實現(xiàn)了RandomAccess接口壤躲,因此可以隨機訪問城菊。

Vector實現(xiàn)了Cloneable,重載了clone()方法碉克,因此可以進行克隆凌唬。

Vector實現(xiàn)了Serializable接口,因此可以進行序列化漏麦。

Vector的操作是線程安全的客税。

Vector的數(shù)據(jù)結(jié)構(gòu)和ArrayList差不多况褪,包含了3個成員變量:elementData,elementCount更耻,capacityIncrement测垛。

(1)elementData是Object[]的數(shù)組,初始大小為10秧均,會不斷的增長食侮。

(2)elementCount是元素的個數(shù)。

(3)capacityIncrement是動態(tài)數(shù)組增長的系數(shù)目胡。

vector的構(gòu)造方法:

Vector(int initialCapacity, int capacityIncrement)

Vector(int initialCapacity)

Vector()

Vector(Collection c)

Vector有四種遍歷方式:

(1)第一種通過迭代器遍歷锯七,即通過Iterator去遍歷

Integer value=null;

Iterator iter=vector.iterator();

while(iter.hasNext())

{

value=(Interger)iter.next();

}

(2)第二種隨機訪問,通過索引進行遍歷

Integer value=null;

int size=vector.size();

for(int i=0;i<size;i++){

value=vector.get(i);

}

(3)第三種通過for循環(huán)的方式

Integer value=null;

for( Integer inte: vector)

{

value=inte;

}

(4)第四種誉己,Enumeration遍歷

Integer value=null;

Enumeration enu=vector.elements();

while(enu.hasMoreElements())

{

value=(Integer)enu.nextElement();

}

Set

特點;? 無序? 不允許重復(fù)的

方法:

public int size() :返回set中元素的數(shù)目眉尸,如果set包含的元素數(shù)大于Integer.MAX_VALUE,返回Integer.MAX_VALUE巨双;

public boolean isEmpty() :如果set中不含元素噪猾,返回true ;

public boolean contains(Object o) :如果set包含指定元素炉峰,返回true 畏妖;

public Iterator iterator() : 返回set中元素的迭代器,元素返回沒有特定的順序疼阔,除非set提高該保證的某些類的實例 戒劫;

public boolean add(Object o) :如果set中不存在指定元素,則向set加入 婆廊;

public boolean remove(Object o) :如果set中存在指定元素迅细,則從set中刪除 ;

public boolean removeAll(Collection c) :如果set包含指定集合淘邻,則從set中刪除指定集合的所有元素 茵典;

public void clear() :從set中刪除所有元素;

特點:

Set最大的特性就是不允許在其中存放的元素是重復(fù)的宾舅,根據(jù)這個特點统阿,我們就可以使用Set 這個接口來實現(xiàn)前面提到的關(guān)于商品種類的存儲需求。Set 可以被用來過濾在其他集合中存放的元素筹我,從而得到一個沒有包含重復(fù)新的集合扶平。

TreeSet


無序不允許重復(fù)的,用的紅黑樹的數(shù)據(jù)結(jié)構(gòu)存儲的蔬蕊。

TreeSet則是對我們的Set中的元素進行排序存放结澄。添加到 TreeSet 的元素必須是可排序的。 而同樣需要對添加到TreeSet中的類對象實現(xiàn) Comparable 接口的支持。與HashSet是基于HashMap實現(xiàn)一樣麻献,TreeSet同樣是基于TreeMap實現(xiàn)的们妥。我們知道TreeMap是一個有序的二叉樹,那么同理TreeSet同樣也是一個有序的勉吻,它的作用是提供有序的Set集合监婶。

方法:

add:將指定的元素添加到此 set(如果該元素尚未存在于 set 中)。

addAll:將指定 collection 中的所有元素添加到此 set 中餐曼。

ceiling:返回此 set 中大于等于給定元素的最小元素压储;如果不存在這樣的元素,則返回 null源譬。

clear:移除此 set 中的所有元素集惋。

clone:返回 TreeSet 實例的淺表副本。屬于淺拷貝踩娘。

comparator:返回對此 set 中的元素進行排序的比較器刮刑;如果此 set 使用其元素的自然順序,則返回 null养渴。

contains:如果此 set 包含指定的元素雷绢,則返回 true。

descendingIterator:返回在此 set 元素上按降序進行迭代的迭代器理卑。

descendingSet:返回此 set 中所包含元素的逆序視圖翘紊。

first:返回此 set 中當(dāng)前第一個(最低)元素。

floor:返回此 set 中小于等于給定元素的最大元素藐唠;如果不存在這樣的元素帆疟,則返回 null。

headSet:返回此 set 的部分視圖宇立,其元素嚴(yán)格小于 toElement踪宠。

higher:返回此 set 中嚴(yán)格大于給定元素的最小元素;如果不存在這樣的元素妈嘹,則返回 null柳琢。

isEmpty:如果此 set 不包含任何元素,則返回 true润脸。

iterator:返回在此 set 中的元素上按升序進行迭代的迭代器柬脸。

last:返回此 set 中當(dāng)前最后一個(最高)元素。

lower:返回此 set 中嚴(yán)格小于給定元素的最大元素毙驯;如果不存在這樣的元素倒堕,則返回 null。

pollFirst:獲取并移除第一個(最低)元素尔苦;如果此 set 為空,則返回 null。

pollLast:獲取并移除最后一個(最高)元素允坚;如果此 set 為空魂那,則返回 null。

remove:將指定的元素從 set 中移除(如果該元素存在于此 set 中)稠项。

size:返回 set 中的元素數(shù)(set 的容量)涯雅。

subSet:返回此 set 的部分視圖/**? ? * 返回此 set 的部分視圖,其元素范圍從 fromElement 到 toElement展运。? ? */???

23活逆、tailSet:返回此 set 的部分視圖

HashSet

HashSet的元素存放順序和添加進去時候的順序沒有任何關(guān)系。如果想要判斷兩個對象是否是同一個對象 ,通常情況比較地址,但是現(xiàn)在需要通過制定內(nèi)容來判斷是否相同hashCode() ?判斷的其各個屬性的hashcode ?而非對象真正的地址

結(jié)論: 如果hashcode相同 有可能是相同的對象,hashcode不同 則一定不是同一個對象hashcode相同還需要equals進一步判斷拗胜,即使用?equals()比如: 如果姓名和年齡都相同 就認(rèn)為是同一個對象調(diào)用過程 ? 首先調(diào)用hashcode方法 ?如果返回值相同則調(diào)用equals方法如果返回值不同 則不調(diào)用equals 直接認(rèn)為不是同一對象蔗候。

對于HashSet而言,它是基于HashMap來實現(xiàn)的埂软,底層采用HashMap來保存元素锈遥。

方法:

iterator()方法返回對此 set 中元素進行迭代的迭代器。返回元素的順序并不是特定的勘畔。底層調(diào)用HashMap的keySet返回所有的key所灸,這點反應(yīng)了HashSet中的所有元素都是保存在HashMap的key中,value則是使用的PRESENT對象炫七,該對象為static final

size()返回此 set 中的元素的數(shù)量(set 的容量)爬立。底層調(diào)用HashMap的size方法,返回HashMap容器的大小万哪。

isEmpty()侠驯,判斷HashSet()集合是否為空,為空返回 true壤圃,否則返回false陵霉。

contains(),判斷某個元素是否存在于HashSet()中伍绳,存在返回true踊挠,否則返回false。更加確切的講應(yīng)該是要滿足這種關(guān)系才能返回true:(o==null ? e==null : o.equals(e))冲杀。底層調(diào)用containsKey判斷HashMap的key值是否為空效床。

add()如果此 set 中尚未包含指定元素,則添加指定元素权谁。如果此Set沒有包含滿足(e==null ? e2==null : e.equals(e2)) 的e2時剩檀,則將e2添加到Set中,否則不添加且返回false旺芽。由于底層使用HashMap的put方法將key = e沪猴,value=PRESENT構(gòu)建成key-value鍵值對辐啄,當(dāng)此e存在于HashMap的key中,則value將會覆蓋原有value运嗜,但是key保持不變壶辜,所以如果將一個已經(jīng)存在的e元素添加中HashSet中,新添加的元素是不會保存到HashMap中担租,所以這就滿足了HashSet中元素不會重復(fù)的特性砸民。

remove如果指定元素存在于此 set 中,則將其移除奋救。底層使用HashMap的remove方法刪除指定的Entry岭参。

clear從此 set 中移除所有元素。底層調(diào)用HashMap的clear方法清除所有的Entry尝艘。

LinkedHashSet

LinkedHashSet 則保持元素的添加順序演侯。不允許重復(fù)的? 存儲的 雙向鏈表? 幫助記錄存儲的順序。LinkedHashSet 再去遍歷的時候要比HashSet 效率高利耍,但是在添加或者刪除修改的時候效率要低(因為其記錄順序要耗費時間)

Map

方法:

特點:Map用于存儲鍵值對蚌本,不允許鍵重復(fù),值可以重復(fù)隘梨。

遍歷方式:

//第一種:普遍使用程癌,二次取值?

? System.out.println("通過Map.keySet遍歷key和value:");? ?

for (String key : map.keySet()) {? ?

System.out.println("key= "+ key + " and value= " + map.get(key));? ? }? ? ? ?

//第二種? ?

System.out.println("通過Map.entrySet使用iterator遍歷key和value:");? ? Iterator> it = map.entrySet().iterator();? ?

while (it.hasNext()) {? ? Map.Entryentry = it.next();?

?? System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());? ? }? ? ?

? //第三種:推薦,尤其是容量大時? ?

System.out.println("通過Map.entrySet遍歷key和value");?

? for (Map.Entryentry : map.entrySet()) {

System.out.println("key=?"?+?entry.getKey()?+?"?and?value=?"?+?entry.getValue());

}

//第四種

System.out.println("通過Map.values()遍歷所有的value轴猎,但不能遍歷key");

for?(String?v?:?map.values())?{

System.out.println("value=?"?+?v);

}

HashMap

HashMap是一個最常用的Map嵌莉,它根據(jù)鍵的hashCode值存儲數(shù)據(jù),根據(jù)鍵可以直接獲取它的值捻脖,具有很快的訪問速度锐峭。HashMap最多只允許一條記錄的鍵為null,允許多條記錄的值為null可婶。HashMap不支持線程的同步沿癞,即任一時刻可以有多個線程同時寫HashMap,可能會導(dǎo)致數(shù)據(jù)的不一致矛渴。?如果需要同步椎扬,可以用Collections.synchronizedMap(HashMap?map)方法使HashMap具有同步的能力。

HashMap提供了三個構(gòu)造函數(shù)

HashMap():構(gòu)造一個具有默認(rèn)初始容量 (16) 和默認(rèn)加載因子 (0.75) 的空 HashMap具温。

HashMap(int initialCapacity):構(gòu)造一個帶指定初始容量和默認(rèn)加載因子 (0.75) 的空 HashMap蚕涤。

HashMap(int initialCapacity, float loadFactor):構(gòu)造一個帶指定初始容量和加載因子的空 HashMap。

在這里提到了兩個參數(shù):初始容量铣猩,加載因子揖铜。這兩個參數(shù)是影響HashMap性能的重要參數(shù),其中容量表示哈希表中桶的數(shù)量达皿,初始容量是創(chuàng)建哈希表時的容量天吓,加載因子是哈希表在其容量自動增加之前可以達到多滿的一種尺度贿肩,它衡量的是一個散列表的空間的使用程度,負(fù)載因子越大表示散列表的裝填程度越高龄寞,反之愈小尸曼。對于使用鏈表法的散列表來說,查找一個元素的平均時間是O(1+a)萄焦,因此如果負(fù)載因子越大,對空間的利用更充分冤竹,然而后果是查找效率的降低拂封;如果負(fù)載因子太小,那么散列表的數(shù)據(jù)將過于稀疏鹦蠕,對空間造成嚴(yán)重浪費冒签。系統(tǒng)默認(rèn)負(fù)載因子為0.75,一般情況下我們是無需修改的钟病。

HashMap是一種支持快速存取的數(shù)據(jù)結(jié)構(gòu)萧恕,要了解它的性能必須要了解它的數(shù)據(jù)結(jié)構(gòu)。

每次新建一個HashMap時肠阱,都會初始化一個table數(shù)組票唆。table數(shù)組的元素為Entry節(jié)點。其中Entry為HashMap的內(nèi)部類屹徘,它包含了鍵key走趋、值value、下一個節(jié)點next噪伊,以及hash值簿煌,這是非常重要的,正是由于Entry才構(gòu)成了table數(shù)組的項為鏈表鉴吹。

LinkedHashMap

LinkedHashMap保存了記錄的插入順序姨伟,在用Iteraor遍歷LinkedHashMap時,先得到的記錄肯定是先插入的豆励。

TreeMap

TreeMap能夠把它保存的記錄根據(jù)鍵排序夺荒,默認(rèn)是按升序排序,也可以指定排序的比較器肆糕,存儲結(jié)構(gòu)為紅黑樹般堆。

LinkedHashMap保存了記錄的插入順序,在用Iteraor遍歷LinkedHashMap時诚啃,先得到的記錄肯定是先插入的淮摔。




其他相關(guān)接口和類

AbstractCollection

此類提供了 Collection 接口的骨干實現(xiàn),從而最大限度地減少了實現(xiàn)此接口所需的工作始赎。要實現(xiàn)一個不可修改的 collection和橙,程序員只需擴展此類仔燕,并提供 iterator 和 size 方法的實現(xiàn)。(iterator 方法返回的迭代器必須實現(xiàn) hasNext 和 next魔招。)晰搀。要實現(xiàn)可修改的 collection,程序員還必須另外重寫此類的 add 方法(否則办斑,會拋出 UnsupportedOperationException)外恕,并且 iterator 方法返回的迭代器必須另外實現(xiàn)其 remove 方法。

實現(xiàn)的子類

???? AbstractLis

此類提供 List 接口的骨干實現(xiàn)乡翅,從而最大限度地減少了實現(xiàn)由“隨機訪問”數(shù)據(jù)存儲(如數(shù)組)支持的接口所需的工作鳞疲。對于連續(xù)的訪問數(shù)據(jù)(如鏈表),應(yīng)優(yōu)先使用AbstractSequentialList

???? AbstractQueue

AbstractQueue是 Java Collections Framework 的成員蠕蚜,是一個基于優(yōu)先級堆的極大優(yōu)先級隊列尚洽。此隊列按照在構(gòu)造時所指定的順序?qū)υ嘏判颍瓤梢愿鶕?jù)元素的自然順序來指定排序靶累,也可以根據(jù) Comparator 來指定腺毫,這取決于使用哪種構(gòu)造方法。優(yōu)先級隊列不允許 null 元素挣柬。依靠自然排序的優(yōu)先級隊列還不允許插入不可比較的對象潮酒。

???? AbstractSet

AbstractSet 類覆蓋了 equals() 和 hashCode() 方法,以確保兩個相等的集返回相同的散列碼邪蛔。若兩個集大小相等且包含相同元素澈灼,則這兩個集相等。按定義店溢,集散列碼是集中元素散列碼的總和叁熔。因此,不論集的內(nèi)部順序如何床牧,兩個相等的集會報告相同的散列碼荣回。


AbstractMap

java.util 類 AbstractMap java.lang.Object java.util.AbstractMap此類提供了 Map 接口的骨干實現(xiàn),從而最大限度地減少了實現(xiàn)此接口所需的工作戈咳。


sortedMap

實現(xiàn)了排序的方法心软,繼承該接口的類都需要實現(xiàn)比較方法


sortedSet

實現(xiàn)了排序的方法,繼承該接口的類都需要實現(xiàn)比較方法


工具類

Arrays

sort() 排序方法

asList() 轉(zhuǎn)換為list

binarySearch() 二分查找

copyOf()復(fù)制

copyOfRange() 復(fù)制

equals() 比較

fill()填充

hashCode()

toString()


collections

addAll()

binarySearch()

copy()復(fù)制

fill()

reverse()


Comparator()接口?? java.util

compare(T t1,T t2)

equals(object o)

comparable接口 java.lang

compareTo( T t)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末著蛙,一起剝皮案震驚了整個濱河市删铃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌踏堡,老刑警劉巖猎唁,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異顷蟆,居然都是意外死亡诫隅,警方通過查閱死者的電腦和手機腐魂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來逐纬,“玉大人蛔屹,你說我怎么就攤上這事』砩” “怎么了兔毒?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長甸箱。 經(jīng)常有香客問我眼刃,道長,這世上最難降的妖魔是什么摇肌? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮仪际,結(jié)果婚禮上围小,老公的妹妹穿的比我還像新娘。我一直安慰自己树碱,他們只是感情好肯适,可當(dāng)我...
    茶點故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著成榜,像睡著了一般框舔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上赎婚,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天刘绣,我揣著相機與錄音,去河邊找鬼挣输。 笑死纬凤,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的撩嚼。 我是一名探鬼主播停士,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼完丽!你這毒婦竟也來了恋技?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤逻族,失蹤者是張志新(化名)和其女友劉穎蜻底,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體聘鳞,經(jīng)...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡朱躺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年刁赖,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片长搀。...
    茶點故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡宇弛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出源请,到底是詐尸還是另有隱情枪芒,我是刑警寧澤,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布谁尸,位于F島的核電站舅踪,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜钉跷,卻給世界環(huán)境...
    茶點故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一乍狐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧货徙,春花似錦、人聲如沸皮胡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽屡贺。三九已至蠢棱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間甩栈,已是汗流浹背泻仙。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留量没,地道東北人饰豺。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像允蜈,于是被迫代替她去往敵國和親冤吨。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,700評論 2 345

推薦閱讀更多精彩內(nèi)容