java基礎(chǔ)之集合

copy自百度

java集合繼承關(guān)系圖

面向?qū)ο笳Z言對(duì)事物的體現(xiàn)都是以對(duì)象的形式,所以為了方便對(duì)多個(gè)對(duì)象的操作洋措,就對(duì)對(duì)象進(jìn)行存儲(chǔ)剑按,集合就是存儲(chǔ)對(duì)象最常用的一種方式。

數(shù)組雖然也可以存儲(chǔ)對(duì)象澜驮,但長(zhǎng)度是固定的陷揪;集合長(zhǎng)度是可變的,數(shù)組中可以存儲(chǔ)基本數(shù)據(jù)類型杂穷,集合只能存儲(chǔ)對(duì)象悍缠。

集合類的特點(diǎn):集合只用于存儲(chǔ)對(duì)象,集合長(zhǎng)度是可變的耐量,集合可以存儲(chǔ)不同類型的對(duì)象飞蚓。


image.png
image
image

上述類圖中,實(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  可以對(duì)集合中的數(shù)據(jù)進(jìn)行排序

Collection定義了集合框架的共性功能碗降。

image

add方法的參數(shù)類型是Object。以便于接收任意類型對(duì)象塘秦。

集合中存儲(chǔ)的都是對(duì)象的引用(地址)讼渊。

3、List的常用子類
  特有方法尊剔。凡是可以操作角標(biāo)的方法都是該體系特有的方法爪幻。

image

——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邑蒋。

注意,對(duì)于判斷元素是否存在姓蜂,以及刪除等操作,依賴的方法是元素的hashcode和equals方法医吊。

——TreeSet:

有序的存放:TreeSet  線程不安全钱慢,可以對(duì)Set集合中的元素進(jìn)行排序

通過compareTo或者compare方法來保證元素的唯一性,元素以二叉樹的形式存放卿堂。

5束莫、Object類

在實(shí)際開發(fā)中經(jīng)常會(huì)碰到區(qū)分同一對(duì)象的問題,一個(gè)完整的類最好覆寫Object類的hashCode()草描、equals()览绿、toString()三個(gè)方法。

6穗慕、集合的輸出

——4種常見的輸出方式

——Iterator: 迭代輸出饿敲,使用最多的輸出方式

——ListIterator: Iterator的子接口,專門用于輸出List中的內(nèi)容

——Enumeration

——foreach

在迭代時(shí)逛绵,不可以通過集合對(duì)象的方法操作集合中的元素怀各,因?yàn)闀?huì)發(fā)生ConcurrentModificationException異常。所以术浪,在迭代器時(shí)瓢对,只能用迭代器的放過操作元素,可是Iterator方法是有限的添吗,只能對(duì)元素進(jìn)行判斷沥曹,取出,刪除的操作,如果想要其他的操作如添加妓美,修改等僵腺,就需要使用其子接口,ListIterator壶栋。該接口只能通過List集合的listIterator方法獲取辰如。

7、Map接口

Correction贵试、Set琉兜、List接口都屬于單值的操作,而Map中的每個(gè)元素都使用key——>value的形式存儲(chǔ)在集合中毙玻。

Map集合:該集合存儲(chǔ)鍵值對(duì)豌蟋。一對(duì)一對(duì)往里存。而且要保證鍵的唯一性桑滩。

image

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:對(duì)元素都有定義索引酸员。有序的蜒车。可以重復(fù)元素幔嗦。
      ——Set:不可以重復(fù)元素酿愧。無序。

Collections是集合框架中的一個(gè)工具類邀泉。該類中的方法都是靜態(tài)的嬉挡。
      提供的方法中有可以對(duì)list集合進(jìn)行排序钝鸽,二分查找等方法。
      通常常用的集合都是線程不安全的庞钢。因?yàn)橐岣咝省?br>       如果多線程操作這些集合時(shí)拔恰,可以通過該工具類中的同步方法,將線程不安全的集合基括,轉(zhuǎn)換成安全的颜懊。

10.比較

<colgroup style="margin: 0px; padding: 0px;"><col width="93" style="margin: 0px; padding: 0px;"><col width="102" style="margin: 0px; padding: 0px;"><col width="154" style="margin: 0px; padding: 0px;"><col width="166" style="margin: 0px; padding: 0px;"></colgroup>
|    | | 是否有序 | 是否允許元素重復(fù) |
| Collection | 否 | 是 |
| List | 是 | 是 |
| Set | AbstractSet | 否 | 否 |
| | HashSet |
| | TreeSet | 是(用二叉排序樹) |
| Map | AbstractMap | 否 | 使用key-value來映射和存儲(chǔ)數(shù)據(jù),key必須唯一风皿,value可以重復(fù) |
| | HashMap |
| | TreeMap | 是(用二叉排序樹) |

11.總結(jié):

List:add/remove/get/set河爹。

1,ArrayList:其實(shí)就是數(shù)組桐款,容量一大咸这,頻繁增刪就是噩夢(mèng),適合隨機(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》虐簦可以用迭代器或者轉(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ì)對(duì)性能有損耗;

2仙辟,LinkedHashMap:繼承自HashMap同波,但通過重寫嵌套類HashMap.Entry實(shí)現(xiàn)了鏈表結(jié)構(gòu),同樣有容量的問題叠国;

3未檩,Properties:是繼承的HashTable。

順便說一下Arrays.asList粟焊,這個(gè)方法的實(shí)現(xiàn)依賴一個(gè)嵌套類冤狡,這個(gè)嵌套類也叫ArrayList!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末项棠,一起剝皮案震驚了整個(gè)濱河市悲雳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌香追,老刑警劉巖合瓢,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異透典,居然都是意外死亡晴楔,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門峭咒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來税弃,“玉大人,你說我怎么就攤上這事凑队≡蚬” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵顽决,是天一觀的道長(zhǎng)短条。 經(jīng)常有香客問我,道長(zhǎng)才菠,這世上最難降的妖魔是什么茸时? 我笑而不...
    開封第一講書人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮赋访,結(jié)果婚禮上可都,老公的妹妹穿的比我還像新娘缓待。我一直安慰自己,他們只是感情好渠牲,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開白布旋炒。 她就那樣靜靜地躺著,像睡著了一般签杈。 火紅的嫁衣襯著肌膚如雪瘫镇。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評(píng)論 1 305
  • 那天答姥,我揣著相機(jī)與錄音铣除,去河邊找鬼。 笑死鹦付,一個(gè)胖子當(dāng)著我的面吹牛尚粘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播敲长,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼郎嫁,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了祈噪?” 一聲冷哼從身側(cè)響起泽铛,我...
    開封第一講書人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎辑鲤,沒想到半個(gè)月后厚宰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡遂填,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了澈蝙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吓坚。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖灯荧,靈堂內(nèi)的尸體忽然破棺而出礁击,到底是詐尸還是另有隱情,我是刑警寧澤逗载,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布哆窿,位于F島的核電站,受9級(jí)特大地震影響厉斟,放射性物質(zhì)發(fā)生泄漏挚躯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一擦秽、第九天 我趴在偏房一處隱蔽的房頂上張望码荔。 院中可真熱鬧漩勤,春花似錦、人聲如沸缩搅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽硼瓣。三九已至究飞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間堂鲤,已是汗流浹背亿傅。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留筑累,地道東北人袱蜡。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像慢宗,于是被迫代替她去往敵國(guó)和親坪蚁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355