《阿里巴巴Java開(kāi)發(fā)手冊(cè)(正式版)》 學(xué)習(xí)筆記 - 集合處理

更多 Java 集合類(lèi)方面的文章厅克,請(qǐng)參見(jiàn)文集《Java 集合類(lèi)》


摘要: 阿里巴巴集團(tuán)推出的《阿里巴巴Java開(kāi)發(fā)手冊(cè)(正式版)》是阿里巴巴近萬(wàn)名開(kāi)發(fā)同學(xué)集體智慧的結(jié)晶赔退,以開(kāi)發(fā)視角為中心,詳細(xì)列舉如何開(kāi)發(fā)更加高效证舟、更加容錯(cuò)硕旗、更加有協(xié)作性,力求知其然女责,更知其不然漆枚,結(jié)合正反例,讓Java開(kāi)發(fā)者能夠提升協(xié)作效率抵知、提高代碼質(zhì)量墙基。

作為一個(gè) Java 開(kāi)發(fā)人員软族,我花了一天時(shí)間閱讀了這個(gè)開(kāi)發(fā)手冊(cè),摘要了一些對(duì)于我有用的知識(shí)點(diǎn)残制。記錄如下立砸,僅供參考。

集合處理

  1. 關(guān)于 hashCodeequals 的處理初茶,遵循如下規(guī)則:
    1) 只要重寫(xiě) equals颗祝,就必須重寫(xiě) hashCode
    2) 因?yàn)?Set 存儲(chǔ)的是不重復(fù)的對(duì)象恼布,依據(jù) hashCodeequals 進(jìn)行判斷螺戳,所以 Set 存儲(chǔ)的對(duì)象必須重寫(xiě)這兩個(gè)方法。
    3) 如果自定義對(duì)象做為 Map 的鍵折汞,那么必須重寫(xiě) hashCodeequals倔幼。
    正例:String 重寫(xiě)了 hashCodeequals 方法,所以我們可以非常愉快地使用 String 對(duì)象作為 key 來(lái)使用字支。
  • ArrayListsubList 結(jié)果不可強(qiáng)轉(zhuǎn)成 ArrayList凤藏,否則會(huì)拋出ClassCastException 異常。
    說(shuō)明:subList 返回的是 ArrayList 的內(nèi)部類(lèi) SubList堕伪,并不是 ArrayList,而是ArrayList 的一個(gè)視圖栗菜,對(duì)于 SubList 子列表的所有操作最終會(huì)反映到原列表上欠雌。
  • subList 場(chǎng)景中,高度注意對(duì)原集合元素個(gè)數(shù)的修改疙筹,會(huì)導(dǎo)致子列表的遍歷富俄、增加、刪除均產(chǎn)生 ConcurrentModificationException 異常而咆。
  • 使用集合轉(zhuǎn)數(shù)組的方法霍比,必須使用集合的 toArray(T[] array),傳入的是類(lèi)型完全一樣的數(shù)組暴备,大小就是 list.size()悠瞬。
    反例:直接使用 toArray 無(wú)參方法存在問(wèn)題,此方法返回值只能是 Object[] 類(lèi)涯捻,若強(qiáng)轉(zhuǎn)其它類(lèi)型數(shù)組將出現(xiàn) ClassCastException 錯(cuò)誤浅妆。
    正例:
List<String> list = new ArrayList<String>(2);
list.add("guan");
list.add("bao");
String[] array = new String[list.size()];
array = list.toArray(array);

說(shuō)明:使用 toArray 帶參方法,入?yún)⒎峙涞臄?shù)組空間不夠大時(shí)障癌,toArray 方法內(nèi)部將重新分配內(nèi)存空間凌外,并返回新數(shù)組地址;如果數(shù)組元素大于實(shí)際所需涛浙,下標(biāo)為 [ list.size() ] 的數(shù)組元素將被置為 null康辑,其它數(shù)組元素保持原值摄欲,因此最好將方法入?yún)?shù)組大小定義與集合元素個(gè)數(shù)一致。

  • 使用工具類(lèi) Arrays.asList()數(shù)組轉(zhuǎn)換成集合時(shí)疮薇,不能使用其修改集合相關(guān)的方法胸墙,它的 add/remove/clear 方法會(huì)拋出 UnsupportedOperationException 異常。
    說(shuō)明:asList 的返回對(duì)象是一個(gè) Arrays 內(nèi)部類(lèi)惦辛,并沒(méi)有實(shí)現(xiàn)集合的修改方法劳秋。Arrays.asList體現(xiàn)的是適配器模式,只是轉(zhuǎn)換接口胖齐,后臺(tái)的數(shù)據(jù)仍是數(shù)組玻淑。
 String[] str = new String[] { "a", "b" };
 List list = Arrays.asList(str);

第一種情況:list.add("c"); 運(yùn)行時(shí)異常。
第二種情況:str[0]= "gujin"; 那么 list.get(0)也會(huì)隨之修改呀伙。

  • 不要在 foreach 循環(huán)里進(jìn)行元素的 remove/add 操作补履。remove 元素請(qǐng)使用 Iterator 方式,如果并發(fā)操作剿另,需要對(duì) Iterator 對(duì)象加鎖箫锤。
    反例
List<String> a = new ArrayList<String>();
a.add("1");
a.add("2");
for (String temp : a) {
    if("1".equals(temp)){
        a.remove(temp);
    }
} 

正例:

Iterator<String> it = a.iterator();
while(it.hasNext()){
    String temp = it.next();
    if(刪除元素的條件){
        it.remove();
    }
} 
  • 集合初始化時(shí),盡量指定集合初始值大小雨女。
  • 使用 entrySet 遍歷 Map 類(lèi)集合 KV谚攒,而不是 keySet 方式進(jìn)行遍歷。
    說(shuō)明:keySet 其實(shí)是遍歷了 2 次氛堕,一次是轉(zhuǎn)為 Iterator 對(duì)象馏臭,另一次是從 hashMap 中取出 key 所對(duì)應(yīng)的 value。而 entrySet 只是遍歷了一次就把 key 和 value 都放到了 entry 中讼稚,效率更高括儒。
    如果是 JDK8,使用 Map.foreach 方法锐想。
  • 合理利用好集合的有序性(sort)和穩(wěn)定性(order)帮寻,避免集合的無(wú)序性(unsort)和不穩(wěn)定性(unorder)帶來(lái)的負(fù)面影響。
    說(shuō)明:穩(wěn)定性指集合每次遍歷的元素次序是一定的赠摇。有序性是指遍歷的結(jié)果是按某種比較規(guī)則依次排列的固逗。如:ArrayList 是 order/unsort;HashMap 是 unorder/unsort蝉稳;TreeSet 是 order/sort抒蚜。
  • 利用 Set 元素唯一的特性,可以快速對(duì)一個(gè)集合進(jìn)行去重操作耘戚,避免使用 Listcontains 方法進(jìn)行遍歷嗡髓、對(duì)比、去重操作收津。

引用:
【Java編碼規(guī)范】《阿里巴巴Java開(kāi)發(fā)手冊(cè)(正式版)》發(fā)布饿这!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末浊伙,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子长捧,更是在濱河造成了極大的恐慌嚣鄙,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件串结,死亡現(xiàn)場(chǎng)離奇詭異哑子,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)肌割,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)卧蜓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人把敞,你說(shuō)我怎么就攤上這事弥奸。” “怎么了奋早?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵盛霎,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我耽装,道長(zhǎng)愤炸,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任掉奄,我火速辦了婚禮摇幻,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘挥萌。我一直安慰自己,他們只是感情好枉侧,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布引瀑。 她就那樣靜靜地躺著,像睡著了一般榨馁。 火紅的嫁衣襯著肌膚如雪憨栽。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,328評(píng)論 1 310
  • 那天翼虫,我揣著相機(jī)與錄音屑柔,去河邊找鬼。 笑死珍剑,一個(gè)胖子當(dāng)著我的面吹牛掸宛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播招拙,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼唧瘾,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼措译!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起饰序,我...
    開(kāi)封第一講書(shū)人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤领虹,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后求豫,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體塌衰,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年蝠嘉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了最疆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡是晨,死狀恐怖肚菠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情罩缴,我是刑警寧澤蚊逢,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站箫章,受9級(jí)特大地震影響烙荷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜檬寂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一终抽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧桶至,春花似錦昼伴、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至女蜈,卻和暖如春持舆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背伪窖。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工逸寓, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人覆山。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓竹伸,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親汹买。 傳聞我的和親對(duì)象是個(gè)殘疾皇子佩伤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359

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