Thinking in Java——容器篇學(xué)習(xí)筆記

寫(xiě)在前面:
這是一篇菜鳥(niǎo)的學(xué)習(xí)筆記蛋勺。

容器的簡(jiǎn)圖

不包含抽象類(lèi)和遺留構(gòu)件

容器的簡(jiǎn)單分類(lèi).png
  • Java 容器類(lèi)類(lèi)庫(kù)的用途是“保存對(duì)象”脱吱。

  • Java 容器類(lèi)都可以自動(dòng)地調(diào)整自己的尺寸缴阎。

  • Java 容器可劃分為兩個(gè)不同的概念: Collection 與 Map只磷。
    1.Collection里面的接口有些是可選的(為了防止接口爆炸的情況)蝙斜,并且未獲支持的操作只有在運(yùn)行時(shí)才能探測(cè)到名惩,因此有可能調(diào)用接口時(shí)會(huì)獲取到UnsupportedOperationException。

List

1.List 接口在 Collection 的基礎(chǔ)上添加了大量的方法孕荠。

  • ArrayList
    1.底層是數(shù)組

  • LinkedList
    1.底層是鏈表
    2.各種Queue和棧的行為由LinkedList提供支持娩鹉。
    3.一些方法需要注意:

// 不移除
getFirst()攻谁、element()// 返回列表的頭,如果List為空拋出NoSuchElemetException底循。
peek() // 返回列表的頭巢株,如果List為空返回null。
// 移除
removeFirst()熙涤、remove()// 移除并返回列表的頭阁苞,如果List為空拋出NoSushElementException。
poll()// 移除并返回列表的頭祠挫,如果List為空返回null那槽。

Stack

如果你只需要棧的行為,那么使用繼承LinkedList就不合適了等舔,因?yàn)檫@樣會(huì)產(chǎn)生具有LinkedList的其他所有方法的類(lèi)(Java1.0的設(shè)計(jì)者在創(chuàng)建java.util.Stack時(shí)骚灸,就犯了這個(gè)錯(cuò)誤)。因此不使用Java原生態(tài)的Stack類(lèi)慌植,而簡(jiǎn)單封裝LinkedList來(lái)實(shí)現(xiàn)棧即可甚牲。

public class Stack<T>{
    private LinkedList<T> storage = new LinkedList<T>();
    public void push(T v) {
        storage.addFirst(v);
    }
    public T peek() {
        return storage.getFirst();
    }
    public T pop() { 
        return storage.removeFirst();
    }
    public boolean empty() {
        return storage.isEmpty();
    }
    public String toString() {
        return storage.toString();
    }
}

Set

1.Set 具有與Collecion完全一樣的接口,因此沒(méi)有任何額外的功能蝶柿,兩者只是行為不同而已丈钙。
2.Set 不保存重復(fù)的元素。

  • HashSet
    1.隨機(jī)查找最快
    2.存儲(chǔ)的順序并無(wú)意義
    3.元素必須定義hashCode()方法

  • TreeSet
    1.按照比較結(jié)果的升序保存對(duì)象
    2.底層是紅-黑樹(shù)
    3.元素必須實(shí)現(xiàn)Comparable接口

  • LinkedHashSet
    1.按照被添加的順序保存對(duì)象
    2.保留HashSet的查詢(xún)速度
    3.元素必須定義hashCode()方法

注:
1.此外交汤,你必須為散列存儲(chǔ)和樹(shù)型存儲(chǔ)都創(chuàng)建一個(gè)equals()方法雏赦,因?yàn)镾et容器需要通過(guò)該方法判斷元素是否重復(fù)。
2.對(duì)于良好的編程風(fēng)格而言芙扎,你應(yīng)該在覆蓋equals()方法時(shí)星岗,總是同時(shí)覆蓋hashCode()方法。

Queue

  • LinkedList 提供了方法以支持隊(duì)列的行為戒洼,并且它實(shí)現(xiàn)了Queue接口俏橘,因此LinkedList可以用作Queue的一種實(shí)現(xiàn)。通過(guò)將LinkedList向上轉(zhuǎn)型為Queue:
Queue queue = new LinkedList();

事實(shí)上Queue接口窄化了對(duì)LinkedList的方法的訪(fǎng)問(wèn)權(quán)限以“專(zhuān)心”當(dāng)作隊(duì)列使用施逾。

  • PriorityQueue
    1.排序是通過(guò)Comparable進(jìn)行控制的(添加到隊(duì)列中的元素實(shí)現(xiàn)Comparable接口)

  • 雙向隊(duì)列
    1.Java標(biāo)準(zhǔn)類(lèi)庫(kù)中沒(méi)有任何顯式的用于雙向隊(duì)列的接口敷矫。但是可以和Stack一樣,通過(guò)組合LinkedList來(lái)實(shí)現(xiàn)一個(gè)Deque類(lèi)汉额。

Map

Map和Collection之間的唯一重疊就是Map可以使用entrySet()、values()方法來(lái)產(chǎn)生Collection

  • HashMap
    1.提供最快的查找技術(shù)
    2.沒(méi)有明顯的順序

  • TreeMap
    1.按照比較結(jié)果的升序保存鍵
    2.唯一有subMap()方法的Map

  • LinkedHashMap
    1.按照插入順序保存鍵
    2.保留了HashMap的查詢(xún)速度
    3.可以在構(gòu)造器中設(shè)定LinkedHashMap實(shí)現(xiàn)最近最少使用算法榨汤,于是沒(méi)有使用過(guò)得元素就會(huì)出現(xiàn)在隊(duì)列的前面蠕搜。

LinkedHashMap linkedHashMap = new LinkedHashMap(16,0.75f,true);
  • WeakHashMap(弱鍵映射)
    1.如果映射之外沒(méi)有引用指向某個(gè)“鍵”,則此“鍵”可以被垃圾收集器回收

  • ConcurrentHashMap
    1.一種線(xiàn)程安全的Map

  • IdentityHashMao
    1.使用==代替equals()對(duì)“鍵”進(jìn)行比較的散列映射收壕。專(zhuān)門(mén)解決特殊問(wèn)題而設(shè)計(jì)的

注:
對(duì)Map中使用的鍵的要求與對(duì)Set中的元素的要求一樣妓灌,都必須有一個(gè)equals()方法轨蛤。如果鍵被用于散列還需要hashCode(),如果鍵被用于TreeMap虫埂,那么它必須實(shí)現(xiàn)Comparable祥山。

迭代器

迭代器是一個(gè)對(duì)象,他的工作是遍歷并選擇序列中的對(duì)象掉伏,統(tǒng)一了對(duì)容器的訪(fǎng)問(wèn)方式缝呕。屬于輕量級(jí)對(duì)象。

1.如果你只是向前遍歷List斧散,并不打算修改List對(duì)象本身供常,那么你可以使用foreach語(yǔ)法更簡(jiǎn)潔。
2.如果對(duì)List要執(zhí)行一個(gè)remove等會(huì)影響容器元素個(gè)數(shù)的操作鸡捐,則使用迭代器或者for()循環(huán)栈暇。因?yàn)槭褂胒oreach()時(shí)會(huì)出現(xiàn)錯(cuò)誤。

  • Iterator
    1.使用方法iterator()要去容器返回一個(gè)Iterator箍镜。
    2.使用next()獲取序列中的下一個(gè)元素源祈。
    3.使用hasNext()檢查序列中是否還有元素。
    4.使用remove()將迭代器新近返回的元素刪除色迂。

  • ListIterator
    1它是更加強(qiáng)大的IIterator香缺,但是只能用于各種List類(lèi)的訪(fǎng)問(wèn)。
    2.它可以雙向移動(dòng)脚草。
    3.可以使用set()方法替換訪(fǎng)問(wèn)過(guò)得最后一個(gè)元素赫悄。
    4.hasPrevious()、privious()方法對(duì)應(yīng)hasNext()馏慨、next()方法埂淮。

注:
1.Map 沒(méi)有iterator()方法,但是可以通過(guò)如下方法遍歷:

for(Map.Entry e: m.entrySet()){
  e.getKey();
  e.getValue();
}

Collection 與 Iterator

  • 使用接口描述的一個(gè)理由是它可以使我們能夠創(chuàng)建更通用的代碼写隶。
  • 用迭代器而不是Collection來(lái)表示容器之間的共性倔撞。

但是Java中將這兩種方法綁定到了一起,實(shí)現(xiàn)Collection就意味著需要提供iterator()方法慕趴。

設(shè)想這種情況:
如果你的類(lèi)已經(jīng)繼承了其他的類(lèi)痪蝇,那么你就不再繼承AbstractCollection了。在這種情況下冕房,要實(shí)現(xiàn)Collection躏啰,就必須實(shí)現(xiàn)該接口中的所以方法。此時(shí)耙册,繼承并提供創(chuàng)建迭代器的能力就會(huì)顯得容易得多了给僵。

Foreach與迭代器

foreach語(yǔ)法主要用于數(shù)組,但是它也可以應(yīng)用于任何Collection對(duì)象。之所以Collection對(duì)象能夠使用于foreach帝际,是因?yàn)镮terable接口蔓同。因此任何實(shí)現(xiàn)Iterable的類(lèi)都可以將它用于foreach語(yǔ)句中。

  • 不存在任何從數(shù)組到Iterator的自動(dòng)轉(zhuǎn)換蹲诀,因此必須手工執(zhí)行轉(zhuǎn)換:
String[] strings;
Arrays.asList(strings);

其他一些記錄

  • Arrays.asList()產(chǎn)生的List對(duì)象會(huì)使用底層數(shù)組作為其物理實(shí)現(xiàn)斑粱,不能對(duì)數(shù)組嘗試改變長(zhǎng)度的操作。如果你執(zhí)行的操作會(huì)修改這個(gè)List脯爪,并且你不想原來(lái)的數(shù)組被修改则北,那么就應(yīng)該在另一個(gè)容器中創(chuàng)建副本。

  • 打亂Collection元素順序

Collections.shuffle(list,rand);
  • 數(shù)據(jù)傳輸對(duì)象(或信使)寫(xiě)法:
// 將域定義為public披粟、final即可
public final K key;
public final V value;
  • 正確的equals()方法必須滿(mǎn)足下列5個(gè)條件:
    1.自反性
    2.對(duì)稱(chēng)性
    3.傳遞性
    4.一致性
    5對(duì)任何不適null的x咒锻,x.equals(null)一定返回false

  • hashCode生成方法:
    1.給int變量result賦予某個(gè)非零參量
    2.為對(duì)象內(nèi)每個(gè)有意義的域計(jì)算出一個(gè)int散列碼c
    3.合并計(jì)算得到散列嗎

result = 37 * result + c;

4.返回result
5.檢查hashCode()最后的生成結(jié)果
6.例如:

int result = 17;
result = 37 * result + s.hashCode();
result = 37 * result + id;
return result;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市守屉,隨后出現(xiàn)的幾起案子惑艇,更是在濱河造成了極大的恐慌,老刑警劉巖拇泛,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件滨巴,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡俺叭,警方通過(guò)查閱死者的電腦和手機(jī)恭取,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)熄守,“玉大人蜈垮,你說(shuō)我怎么就攤上這事≡U眨” “怎么了攒发?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)晋南。 經(jīng)常有香客問(wèn)我惠猿,道長(zhǎng),這世上最難降的妖魔是什么负间? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任偶妖,我火速辦了婚禮,結(jié)果婚禮上政溃,老公的妹妹穿的比我還像新娘趾访。我一直安慰自己,他們只是感情好董虱,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布腹缩。 她就那樣靜靜地躺著,像睡著了一般空扎。 火紅的嫁衣襯著肌膚如雪藏鹊。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,165評(píng)論 1 299
  • 那天转锈,我揣著相機(jī)與錄音盘寡,去河邊找鬼。 笑死撮慨,一個(gè)胖子當(dāng)著我的面吹牛竿痰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播砌溺,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼影涉,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了规伐?” 一聲冷哼從身側(cè)響起蟹倾,我...
    開(kāi)封第一講書(shū)人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎猖闪,沒(méi)想到半個(gè)月后鲜棠,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡培慌,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年豁陆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吵护。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡盒音,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出馅而,到底是詐尸還是另有隱情祥诽,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布用爪,位于F島的核電站原押,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏偎血。R本人自食惡果不足惜诸衔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望颇玷。 院中可真熱鬧笨农,春花似錦、人聲如沸帖渠。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至份招,卻和暖如春切揭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背锁摔。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工廓旬, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人谐腰。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓孕豹,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親十气。 傳聞我的和親對(duì)象是個(gè)殘疾皇子励背,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類(lèi)相關(guān)的語(yǔ)法砸西,內(nèi)部類(lèi)的語(yǔ)法叶眉,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法籍胯,線(xiàn)程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,623評(píng)論 18 399
  • 從三月份找實(shí)習(xí)到現(xiàn)在竟闪,面了一些公司,掛了不少杖狼,但最終還是拿到小米炼蛤、百度、阿里蝶涩、京東理朋、新浪、CVTE绿聘、樂(lè)視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,240評(píng)論 11 349
  • 3.3 集合 一方面嗽上, 面向?qū)ο笳Z(yǔ)言對(duì)事物的體現(xiàn)都是以對(duì)象的形式,為了方便對(duì)多個(gè)對(duì)象的操作熄攘,就要對(duì)對(duì)象進(jìn)行存儲(chǔ)兽愤。另...
    閆子揚(yáng)閱讀 726評(píng)論 0 1
  • 本文出自 Eddy Wiki ,轉(zhuǎn)載請(qǐng)注明出處:http://eddy.wiki/interview-java.h...
    eddy_wiki閱讀 1,159評(píng)論 0 16
  • 不知道大家有沒(méi)有用過(guò)微信搖一搖功能挪圾,沒(méi)用過(guò)的最好也別用了浅萧,尤其是智商不夠用的。 上面全是套路啊哲思。 本人女洼畅,我反正是...
    一縷仙兒氣閱讀 383評(píng)論 0 2