面向?qū)ο笳Z言對事物的體現(xiàn)都是以對象的形式,所以為了方便對多個(gè)對象的操作,就對對象進(jìn)行存儲(chǔ),集合就是存儲(chǔ)對象最常用的一種方式。
文登網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián)公司,文登網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為文登上千余家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)公司要多少錢,請找那個(gè)售后服務(wù)好的文登做網(wǎng)站的公司定做!數(shù)組雖然也可以存儲(chǔ)對象,但長度是固定的;集合長度是可變的,數(shù)組中可以存儲(chǔ)基本數(shù)據(jù)類型,集合只能存儲(chǔ)對象。
集合類的特點(diǎn):集合只用于存儲(chǔ)對象,集合長度是可變的,集合可以存儲(chǔ)不同類型的對象。
上述類圖中,實(shí)線邊框的是實(shí)現(xiàn)類,比如ArrayList,LinkedList,HashMap等,折線邊框的是抽象類,比如AbstractCollection,AbstractList,AbstractMap等,而點(diǎn)線邊框的是接口,比如Collection,Iterator,List等。
1、Iterator接口
Iterator接口,這是一個(gè)用于遍歷集合中元素的接口,主要包含hashNext(),next(),remove()三種方法。它的一個(gè)子接口LinkedIterator在它的基礎(chǔ)上又添加了三種方法,分別是add(),previous(),hasPrevious()。也就是說如果是先Iterator接口,那么在遍歷集合中元素的時(shí)候,只能往后遍歷,被遍歷后的元素不會(huì)在遍歷到,通常無序集合實(shí)現(xiàn)的都是這個(gè)接口,比如HashSet,HashMap;而那些元素有序的集合,實(shí)現(xiàn)的一般都是LinkedIterator接口,實(shí)現(xiàn)這個(gè)接口的集合可以雙向遍歷,既可以通過next()訪問下一個(gè)元素,又可以通過previous()訪問前一個(gè)元素,比如ArrayList。
抽象類的使用。如果要自己實(shí)現(xiàn)一個(gè)集合類,去實(shí)現(xiàn)那些抽象的接口會(huì)非常麻煩,工作量很大。這個(gè)時(shí)候就可以使用抽象類,這些抽象類中給我們提供了許多現(xiàn)成的實(shí)現(xiàn),我們只需要根據(jù)自己的需求重寫一些方法或者添加一些方法就可以實(shí)現(xiàn)自己需要的集合類,工作流昂大大降低。
2、Collection (集合的大接口)繼承關(guān)系
——List 可以存放重復(fù)的內(nèi)容
——Set 不能存放重復(fù)的內(nèi)容,所以的重復(fù)內(nèi)容靠hashCode()和equals()兩個(gè)方法區(qū)分
——Queue 隊(duì)列接口
——SortedSet 可以對集合中的數(shù)據(jù)進(jìn)行排序
Collection定義了集合框架的共性功能。
add方法的參數(shù)類型是Object。以便于接收任意類型對象。
集合中存儲(chǔ)的都是對象的引用(地址)。
3、List的常用子類
特有方法。凡是可以操作角標(biāo)的方法都是該體系特有的方法。
——ArrayList 線程不安全,查詢速度快
——Vector 線程安全,但速度慢,已被ArrayList替代
——LinkedList 鏈表結(jié)果,增刪速度快
4、Set接口
Set:元素是無序(存入和取出的順序不一定一致),元素不可以重復(fù)。
——HashSet:底層數(shù)據(jù)結(jié)構(gòu)是哈希表。是線程不安全的。不同步。
HashSet是如何保證元素唯一性的呢?
是通過元素的兩個(gè)方法,hashCode和equals來完成。
如果元素的HashCode值相同,才會(huì)判斷equals是否為true。
如果元素的hashcode值不同,不會(huì)調(diào)用equals。
注意,對于判斷元素是否存在,以及刪除等操作,依賴的方法是元素的hashcode和equals方法。
——TreeSet:
有序的存放:TreeSet 線程不安全,可以對Set集合中的元素進(jìn)行排序
通過compareTo或者compare方法來保證元素的唯一性,元素以二叉樹的形式存放。
5、Object類
在實(shí)際開發(fā)中經(jīng)常會(huì)碰到區(qū)分同一對象的問題,一個(gè)完整的類最好覆寫Object類的hashCode()、equals()、toString()三個(gè)方法。
6、集合的輸出
——4種常見的輸出方式
——Iterator: 迭代輸出,使用最多的輸出方式
——ListIterator: Iterator的子接口,專門用于輸出List中的內(nèi)容
——Enumeration
——foreach
在迭代時(shí),不可以通過集合對象的方法操作集合中的元素,因?yàn)闀?huì)發(fā)生ConcurrentModificationException異常。所以,在迭代器時(shí),只能用迭代器的放過操作元素,可是Iterator方法是有限的,只能對元素進(jìn)行判斷,取出,刪除的操作,如果想要其他的操作如添加,修改等,就需要使用其子接口,ListIterator。該接口只能通過List集合的listIterator方法獲取。
7、Map接口
Correction、Set、List接口都屬于單值的操作,而Map中的每個(gè)元素都使用key——>value的形式存儲(chǔ)在集合中。
Map集合:該集合存儲(chǔ)鍵值對。一對一對往里存。而且要保證鍵的唯一性。
8、Map接口的常用子類
Map
——HashMap:底層是哈希表數(shù)據(jù)結(jié)構(gòu),允許使用 null 值和 null 鍵,該集合是不同步的。將hashtable替代,jdk1.2.效率高。
——TreeMap:底層是二叉樹數(shù)據(jù)結(jié)構(gòu)。線程不同步。可以用于給map集合中的鍵進(jìn)行排序。
9、集合工具類
Collections:集合框架的工具類。里面定義的都是靜態(tài)方法。
Collections和Collection有什么區(qū)別?
Collection是集合框架中的一個(gè)頂層接口,它里面定義了單列集合的共性方法。
它有兩個(gè)常用的子接口,
——List:對元素都有定義索引。有序的。可以重復(fù)元素。
——Set:不可以重復(fù)元素。無序。
Collections是集合框架中的一個(gè)工具類。該類中的方法都是靜態(tài)的。
提供的方法中有可以對list集合進(jìn)行排序,二分查找等方法。
通常常用的集合都是線程不安全的。因?yàn)橐岣咝省?br /> 如果多線程操作這些集合時(shí),可以通過該工具類中的同步方法,將線程不安全的集合,轉(zhuǎn)換成安全的。
10.比較
11.總結(jié):
List:add/remove/get/set。
1、ArrayList:其實(shí)就是數(shù)組,容量一大,頻繁增刪就是噩夢,適合隨機(jī)查找;
2、LinkedList:增加了push/[pop|remove|pull],其實(shí)都是removeFirst;
3、Vector:歷史遺留產(chǎn)物,同步版的ArrayList,代碼和ArrayList太像;
4、Stack:繼承自Vector。Java里其實(shí)沒有純粹的Stack,可以自己實(shí)現(xiàn),用組合的方式,封裝一下LinkedList即可;
5、Queue:本來是單獨(dú)的一類,不過在SUN的JDK里就是用LinkedList來提供這個(gè)功能的,主要方法是offer/pull/peek,因此歸到這里呢。
Set:add/remove??梢杂玫骰蛘咿D(zhuǎn)換成list。
1、HashSet:內(nèi)部采用HashMap實(shí)現(xiàn)的;
2、LinkedHashSet:采用LinkedHashMap實(shí)現(xiàn);
3、TreeSet:TreeMap。
Map:put/get/remove。
1、HashMap/HashTable:散列表,和ArrayList一樣采用數(shù)組實(shí)現(xiàn),超過初始容量會(huì)對性能有損耗;
2、LinkedHashMap:繼承自HashMap,但通過重寫嵌套類HashMap.Entry實(shí)現(xiàn)了鏈表結(jié)構(gòu),同樣有容量的問題;
3、Properties:是繼承的HashTable。
順便說一下Arrays.asList,這個(gè)方法的實(shí)現(xiàn)依賴一個(gè)嵌套類,這個(gè)嵌套類也叫ArrayList!
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。