Java集合

? ? ? ?Java集合在某種程度上可以說是對一些數(shù)據(jù)結(jié)構(gòu)與算法的封裝喊熟,并給出相應(yīng)的接口挽拂,這充分的體現(xiàn)了面向?qū)ο缶幊痰乃枷搿?/p>

Java中集合的結(jié)構(gòu)大概如下圖所示:

圖 ?1

1.Iterable和Iterator


java.lang.Iterable

java.util.Iterator

? ? ? ?通過它們兩在java中的位置可以看錯(cuò)Iterable是屬于基礎(chǔ)類的一份子,而Iterator是在集合類當(dāng)中。Iterator是迭代器類,而Iterable是接口磷脯,因?yàn)镮terable中封裝了Iterator接口蛾找,只要實(shí)現(xiàn)了Iterable接口的類娩脾,就可以使用Iterator迭代器了。因此List和Set位于Iterable下就不難理解了打毛。

2.List

? ? ? ? List中用的最多的為ArrayList和LinkedList柿赊,這兩個(gè)相當(dāng)于數(shù)組和鏈表的形式,ArrayList是連續(xù)存儲(chǔ)幻枉,LinkList是分散存儲(chǔ)碰声,我們可以自己動(dòng)手寫來模擬這種存儲(chǔ)方式,而他們的優(yōu)缺點(diǎn)也和數(shù)組鏈表的優(yōu)缺點(diǎn)大致相同熬甫,不再陳述胰挑。

? ? ? MyArrayListMyLinkedList

? ? ? 而Java作為面向?qū)ο笳Z音椿肩,也為我們封裝了很多方法瞻颂,以便于對List進(jìn)行操作:

? ? ? int size() :獲得數(shù)據(jù)個(gè)數(shù)

? ? ? boolean contains(Object o) :是否包含數(shù)據(jù)o

? ? ? int indexOf(Object o) :返回元素o第一次出現(xiàn)的位置

? ? ? Object[] toArray(): 轉(zhuǎn)換成長度固定的數(shù)組

? ? ? get(int index) :返回第index個(gè)元素

? ? ? add(E e):向最后添加元素。數(shù)據(jù)可以重復(fù)

? ? ? add(int index, E element):某個(gè)位置之后添加元素

? ? ? remove(int index):刪除一個(gè)位置的元素

? ? ? remove(Object o):刪除元素o

? ? ? void clear():清空

3.Set

? ? ? ?Set郑象,類似于數(shù)學(xué)中的集合贡这,他存儲(chǔ)的元素是不重復(fù)的,Set中的數(shù)據(jù)都是只有一份厂榛,并且Set中的數(shù)據(jù)不是以鍵值對存儲(chǔ)的盖矫,以下是Set中一些常用的方法:

? ? ? boolean contains(Object o):判斷是否存在元素o

? ? ? add(E e) :添加元素到集合

? ? ? remove(Object o) :從集合移除

? ? ? int size() :獲取個(gè)數(shù)

? ? ? boolean isEmpty():是否空

? ? ? void clear() :清空

4.Map

? ? ? ?首先實(shí)現(xiàn)了Map接口的類的數(shù)據(jù)的存儲(chǔ)都是以鍵值對的形式來進(jìn)行存儲(chǔ)的,而在實(shí)際中用的最多的就是HashMap击奶,要了解什么是HashMap辈双,要先了解什么是哈希算法。簡單來說柜砾,哈希算法就是根據(jù)一定的規(guī)則湃望,計(jì)算一個(gè)數(shù)據(jù)應(yīng)該放到哪個(gè)地址,因此,就有一定的幾率使得兩個(gè)完全不同的數(shù)據(jù)計(jì)算得到的地址是一樣的喜爷,而一個(gè)好的哈希算法是使這種情況發(fā)生的幾率最小冗疮。

? ? ? HashMap中數(shù)據(jù)進(jìn)行存儲(chǔ)時(shí)鍵不能重復(fù),但值可以重復(fù)檩帐,這就造成了數(shù)據(jù)的存儲(chǔ)略慢术幔,但是查詢速度快,理論上來講查詢速度和數(shù)據(jù)量無關(guān)湃密。正所謂魚與熊掌不可兼得诅挑,編程也是這樣的,同樣只要了解其基本原理泛源,在某種程度上就可以說已經(jīng)學(xué)會(huì)了HashMap拔妥,這得力于Java中封裝的大量方法:

? ? ? int size() :鍵值對條數(shù)

? ? ? V get(Object key) :根據(jù)鍵獲得值。如果不存在這樣的鍵則返回null

? ? ? boolean containsKey(Object key) :判斷鍵是否存在

? ? ? put(K key, V value) :鍵值對放入map达箍。如果已經(jīng)key已經(jīng)存在則用新的鍵值對替換舊的鍵值對没龙,也就是“鍵不能重復(fù)”

? ? ? remove(Object key):根據(jù)鍵移除鍵值對

? ? ? void clear() :清空

? ? ? Set keySet() :得到所有的key,返回值是Set類型缎玫。

5.泛型

? ? ? ?泛型硬纤,簡單來講,就是人為規(guī)定了參數(shù)的標(biāo)準(zhǔn)赃磨,或者類型筝家,除了我規(guī)定的類型外都不可以傳進(jìn)來,Java中除了集合可以使用外我們也可以自己定義泛型邻辉,方法也很簡單:在類名后面用<>聲明類型的“代替符號”溪王,然后類中需要用這個(gè)類型的地方用這個(gè)名字就行。

? ? ? 泛型不能使用int值骇、double莹菱、boolean等原始類型,而應(yīng)使用比如Integer雷客、Double芒珠、Boolean等包裝類型,怎樣去判斷一個(gè)類型是基本類型還是包裝類型呢:首字母大寫是包裝類型搅裙,小寫為基本類型皱卓。這也解釋了Java中String為什么有那么多的方法,因?yàn)椤八氖鬃帜甘谴髮懙摹辈看.?dāng)然用的時(shí)候是可以使用原始類型娜汁,因?yàn)橛胁鹣溲b箱。

? ? ? Java數(shù)組支持協(xié)變兄朋,什么是協(xié)變呢掐禁,簡單說就是父類相關(guān)的變量可以指向子類相關(guān)的對象,但泛型是不支持協(xié)變。

? ? ? ArrayList list1 = new ArrayList<String>() 這樣定義是沒錯(cuò)的傅事,但list1變量是不支持泛型的缕允,而且放進(jìn)去其他類型編譯時(shí)、運(yùn)行時(shí)也不報(bào)錯(cuò)蹭越,為什么這樣:因?yàn)橛蟹盒筒脸?br>

ArrayList list1 = new ArrayList<String>() ;

ArrayList<String> list2 = new ArrayList();

ArrayList list3 <String>= new ArrayList<String>();

? ? ? 泛型擦除是java文件編譯為class文件是做的鬼障本,如果將class文件反編譯為java文件,那么响鹃,上面三條語句會(huì)變成這樣:

ArrayList list1 = new ArrayList() ;

ArrayList<String> list2 = new ArrayList();

ArrayList list3<String> = new ArrayList();

? ? ? 正向編譯時(shí)驾霜,會(huì)自動(dòng)去除后面的<String>,因此第一中實(shí)例化沒有實(shí)習(xí)泛型买置,第二三中實(shí)現(xiàn)了泛型粪糙,為了保證良好的習(xí)慣,應(yīng)采取第三種書寫方式忿项。

? ? ? 用泛型集合編寫代碼的時(shí)候可以避免放入數(shù)據(jù)類型錯(cuò)誤蓉冈,并且取數(shù)據(jù)的時(shí)候避免類型轉(zhuǎn)換。當(dāng)然倦卖,泛型也有不好的地方:

? ? ? 1洒擦、運(yùn)行時(shí)無法得知對象的泛型類型信息。比如無法用arr instanceof LinkedList判斷

? ? ? 2怕膛、一旦轉(zhuǎn)換為非泛型變量,那么就有放入非法數(shù)據(jù)的可能性秦踪。沒有根除的辦法褐捻。

? ? ? 3、不同類型的泛型不能構(gòu)成重載方法椅邓。例如:

static void m1(LinkedList<Integer> list)

static void m1(LinkedList<String> list)

static void m1(LinkedList list)

? ? ? 上面三種方法是不能構(gòu)成重載方法的。

5-1.有界類型

有界類型是指景馁,在指定一個(gè)類型參數(shù)時(shí)板壮,可以指定一個(gè)上界,聲明所有的實(shí)際類型都必須是這個(gè)超類的直接或間接子類合住,比如:

class className<T extends superclass>

6.其它總結(jié)

? ? ? Stack(棧):先入后出绰精。push放入數(shù)據(jù),pop取出數(shù)據(jù)

? ? ? Queue(隊(duì)列):先入先出透葛。offer入隊(duì)笨使,poll出隊(duì)

? ? ? Vector、Hashtable被廢棄僚害,不推薦使用硫椰。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子靶草,更是在濱河造成了極大的恐慌蹄胰,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奕翔,死亡現(xiàn)場離奇詭異烤送,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)糠悯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門帮坚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人互艾,你說我怎么就攤上這事试和。” “怎么了纫普?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵阅悍,是天一觀的道長。 經(jīng)常有香客問我昨稼,道長节视,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任假栓,我火速辦了婚禮寻行,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘匾荆。我一直安慰自己拌蜘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布牙丽。 她就那樣靜靜地躺著简卧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪烤芦。 梳的紋絲不亂的頭發(fā)上举娩,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天,我揣著相機(jī)與錄音构罗,去河邊找鬼铜涉。 笑死,一個(gè)胖子當(dāng)著我的面吹牛绰播,可吹牛的內(nèi)容都是我干的骄噪。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼蠢箩,長吁一口氣:“原來是場噩夢啊……” “哼链蕊!你這毒婦竟也來了事甜?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤滔韵,失蹤者是張志新(化名)和其女友劉穎逻谦,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體陪蜻,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡邦马,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了宴卖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片滋将。...
    茶點(diǎn)故事閱讀 38,605評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖症昏,靈堂內(nèi)的尸體忽然破棺而出随闽,到底是詐尸還是另有隱情,我是刑警寧澤肝谭,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布掘宪,位于F島的核電站,受9級特大地震影響攘烛,放射性物質(zhì)發(fā)生泄漏魏滚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一坟漱、第九天 我趴在偏房一處隱蔽的房頂上張望鼠次。 院中可真熱鬧,春花似錦靖秩、人聲如沸须眷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至捕传,卻和暖如春惠拭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背庸论。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工职辅, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人聂示。 一個(gè)月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓域携,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鱼喉。 傳聞我的和親對象是個(gè)殘疾皇子秀鞭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評論 2 348

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

  • title: java集合框架學(xué)習(xí)總結(jié) tags:集合框架 categories:總結(jié) date: 2017-03...
    行徑行閱讀 1,676評論 0 2
  • 1.Java集合框架是什么趋观?說出一些集合框架的優(yōu)點(diǎn)? 每種編程語言中都有集合锋边,最初的Java版本包含幾種集合類:V...
    獨(dú)念白閱讀 757評論 0 2
  • 1.Java集合框架是什么皱坛?說出一些集合框架的優(yōu)點(diǎn)? 每種編程語言中都有集合豆巨,最初的Java版本包含幾種集合類:V...
    Oneisall_81a5閱讀 899評論 0 11
  • 人是構(gòu)成社會(huì)的重要的要素剩辟,無論我們的工作還是生活,都離不開與人打交道往扔,需要溝通與交流贩猎,這個(gè)事實(shí)總是存在的。 如今進(jìn)...
    喝酒的鋼鐵漢子閱讀 275評論 0 0
  • 人這種生物噪馏,不知是否是群居動(dòng)物的緣故,無論決定什么事情绿饵,總是希望身邊能有一個(gè)人提提意見欠肾,人家贊同你,你便信心滿滿拟赊,...
    繼續(xù)吧人生閱讀 1,110評論 8 7