【優(yōu)雅編程之道】之集合的8點建議

開心一笑

【一帶孩的媽說,她最喜歡的狀態(tài)是:
枯藤老樹昏鴉,空調(diào)WiFi西瓜。
葛優(yōu)同款沙發(fā)、夕陽西下,我就往那一趴!一趴!一趴!誰也別叫我!
最不想聽到有人叫我“媽……”】


視頻教程

大家好,我錄制的視頻《Java之優(yōu)雅編程之道》已經(jīng)在CSDN學(xué)院發(fā)布了,有興趣的同學(xué)可以購買觀看,相信大家一定會收獲到很多知識的。謝謝大家的支持……

視頻地址:http://edu.csdn.net/lecturer/994


蘭花.png

提出問題

項目開發(fā)過程中集合應(yīng)該注意的幾點???


解決問題

前言

集合作為java開發(fā)工作中一個非常重要的組成部分,基本和java字符串使用頻率一樣高。

我看過很多的代碼,但對于集合來說,大部分都沒有使用的很好。因此,我根據(jù)我們公司的項目,總結(jié)了以下幾點建議,希望可以幫助各位學(xué)員徹底掌握如何使用集合。

1.集合的簡單回顧

  • List 集合的元素是有序、允許有重復(fù)的元素,Set中的元素?zé)o序、不允許有重復(fù)元素。
  • LinkedList適合指定位置插入、刪除操作,不適合查找;ArrayList、Vector適合查找,不適合指定位置的插入、刪除操作。
  • Vector線程同步,ArrayList、LinkedList線程不同步。
  • Map 中需要輸入兩個值:KEY 和 Value,其中 Key 值是唯一的,不能重復(fù),Value 值是可以重復(fù)的,Key和Value 都可以當作泛型自由傳遞引用數(shù)據(jù)類型,運用比較靈活。

2.Java集合與null需要注意的幾點

  • List.add(null):將向集合新增一個null元素,允許存在多個null元素

  • Set.add(null):將向集合新增一個null元素,但只允許存在一個null元素

  • Map.put(null, Object):將向集合新增一個Key為null的元素,但只允許存在一個Key為null元素

  • List.addAll(null):將拋NullPointerException異常。

  • Set.addAll(null):將拋NullPointerException異常。

  • Map.putAll(null):將拋NullPointerException異常。

**3.謹慎使用原生態(tài)集合類型 **

這一點,之前在講解數(shù)組的時候,就已經(jīng)提過了。

例如:

public static void main(String[] args) {
  int[] nums = new int[] { 1, 2, 3, 4, 5 };
  List list = Arrays.asList(nums);
  System.out.println(list.size());
  // 此時輸出的size為1
}

例如:

@Test
public void test(){
   //禁止寫原生集合
   List list = new ArrayList();
   Set set = new HashSet<>();
   Map map = new HashMap<>();
}

4.設(shè)置集合的容量參數(shù)提高性能

//不設(shè)置容量參數(shù)
List<String> list = new ArrayList<>();

如果像上面這樣使用默認的構(gòu)造方法,初始容量被設(shè)置為10。當ArrayList中的元素超過10個以后,會重新分配內(nèi)存空間,使數(shù)組的大小增長到16。可以通過調(diào)試看到動態(tài)增長的數(shù)量變化:10->16->25->38->58->88->...

也可以使用下面的方式進行聲明:

List arrayList = new ArrayList(4);

將ArrayList的默認容量設(shè)置為4。當ArrayList中的元素超過4個以后,會重新分配內(nèi)存空間,使數(shù)組的大小增長到7。可以通過調(diào)試看到動態(tài)增長的數(shù)量變化:4->7->11->17->26->...

那么容量變化的規(guī)則是什么呢?請看下面的公式:

((舊容量 * 3) / 2) + 1

一旦容量發(fā)生變化,就要帶來額外的內(nèi)存開銷,和時間上的開銷。所以,在已經(jīng)知道容量大小的情況下,推薦使用下面方式進行聲明:

List arrayList = new ArrayList(CAPACITY_SIZE);

即指定默認容量大小的方式。

5.集合判空的優(yōu)雅方式

 @Test
public void test(){

    List<String> list = new ArrayList<>();
    //第一種方法
    if(null != list && list.size() > 0){

    }

    //第二種方法:簡潔和優(yōu)雅
    if(CollectionUtils.isNotEmpty(list)){

    }
}

結(jié)論:推薦大家使用第二種方法。

CollectionUtils工具類

出自 import org.apache.commons.collections.CollectionUtils;

CollectionUtils在真實項目中,是一個非常好用的工具類,使用非常頻繁。它可以使代碼更加簡潔和安全。

6.空集合的優(yōu)雅獲取方式

錯誤的方式:

@Test
public List<String> test(){
    //處理相關(guān)的業(yè)務(wù)
    //......
    //最后返回空的集合
    return new ArrayList<>();
}   

正確的方式:

@Test
public List<String> test(){
    //處理相關(guān)的業(yè)務(wù)
    //......
    //最后返回空的集合
    return Collections.EMPTY_LIST;
}

對于Set:

Collections.EMPTY_SET

對于Map:

Collections.EMPTY_MAP

7.java常用集合性能比拼

ArrayList,LinkedList,或者Map在真實項目中要學(xué)會選擇,不要清一色的使用ArrayList。根據(jù)具體的業(yè)務(wù)來使用集合,才可以體現(xiàn)一個程序員的高超處理水平。

8.其他類型Map的熟悉和使用

  • 線程安全的map:ConcurrentMap,是線程安全的。更多的例子可以百度。
  • 雙向map:DualHashBidiMap:DualHashBidiMap可以通過key找到value,也可以通過value找到key
  • 一對多map:MultiMap 一個key不在是簡單的指向一個對象,而是一組對象

固定大小map:LRUMap大小固定。它不是同步的,也不是線程安全的,新增的元素個數(shù)大于允許的最大集合個數(shù)時,則會執(zhí)行LRU淘汰算法。 所有的元素在LRUMap中會根據(jù)最近使用情況進行排序。最近使用的會放在元素的最前面(LRUMap是通過鏈表來存儲元素內(nèi)容). 所以LRUMap進行淘汰時只需要刪除鏈表最后一個即可(即header.after所指的元素對象)

影響元素的使用情況的操作:

1.put 當新增加一個集合元素對象,則表示該對象是最近被訪問的
2.get 操作會把當前訪問的元素對象作為最近被訪問的,會被移到鏈接表頭
注:當執(zhí)行containsKey和containsValue操作時,不會影響元素的訪問情況。

  • 多個關(guān)鍵字經(jīng)過組合映射map:MultiKeyedMap

  • 允許Key重復(fù)的Map:IdentityHashMap

我們應(yīng)該根據(jù)具體的業(yè)務(wù)場景使用相應(yīng)的Map,而不是清一色的使用HashMap等等。這些都是一些真實的工作經(jīng)驗總結(jié),希望大家以后在使用Map的時候可以多考慮,多現(xiàn)在合適的Map類型。

結(jié)束語

今天講了很多關(guān)于集合的問題,由于時間問題,有一些知識點沒辦法深入下去,希望各位學(xué)員課下可以自己去研究學(xué)習(xí)。


讀書感悟

來自鬼腳七《沒事別隨便思考人生》

  • 一千萬次前思后想,也趕不上一次說干就干。
  • 我們最容易犯的錯誤是以己養(yǎng)鳥,用自己最喜歡的方式來對待別人。出發(fā)點是好的,但對方不一定會接受,有時候反而是種傷害。
  • 快樂只存在于當下,一切的追求,都是對當下的否定,也是對快樂的抹殺。
  • 懦夫為自己的失敗找到了100個借口,但他還是個懦夫。
  • 人生只有兩件事情是公平的,一件是死亡,因為每個人都會死亡;另一件是時間,因為每個人每天都只有24小時。每個人時間分配不同,就會有不同的收獲,也會有不同的人生道路。
  • 所有的成功,只存在于別人的評價里。所有的失敗,只存在于自己的眼光里。

經(jīng)典故事

【有三個人要被關(guān)進監(jiān)獄三年,監(jiān)獄長給他們?nèi)齻€一人一個要求。
  美國人愛抽雪茄,要了三箱雪茄。
  法國人最浪漫,要一個美麗的女子相伴。
  而猶太人說,他要一部與外界溝通的電話。
  三年過后,第一個沖出來的是美國人,嘴里鼻孔里塞滿了雪茄,大喊道:“給我火,給我火!原來他忘了要火了。
  接著出來的是法國人。只見他手里抱著一個小孩子,美麗女子手里牽著一個小孩子,肚子里還懷著第三個。
  最后出來的是猶太人,他緊緊握住監(jiān)獄長的手說:“這三年來我每天與外界聯(lián)系,我的生意不但沒有停頓,反而增長了200%,為了表示感謝,我送你一輛勞施萊斯!”
【學(xué)習(xí)啦】心得:什么樣的選擇決定什么樣的生活。今天的生活是由三年前我們的選擇決定的,而今天我們的抉擇將決定我們?nèi)旰蟮纳睢N覀円x擇接觸最新的信息,了解最新的趨勢,從而更好的創(chuàng)造自己的將來。 】


大神文章


其他

如果有帶給你一絲絲小快樂,就讓快樂繼續(xù)傳遞下去,歡迎點贊、頂、歡迎留下寶貴的意見、多謝支持!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,760評論 18 399
  • 一、基本數(shù)據(jù)類型 注釋 單行注釋:// 區(qū)域注釋:/* */ 文檔注釋:/** */ 數(shù)值 對于byte類型而言...
    龍貓小爺閱讀 4,288評論 0 16
  • Collection接口 Collection接口是所有集合的祖先類。他有兩個構(gòu)造方法,一個無參構(gòu)造,一個是帶Co...
    夜幕繁華閱讀 608評論 0 0
  • 1.Java集合框架是什么?說出一些集合框架的優(yōu)點?每種編程語言中都有集合,最初的Java版本包含幾種集合類:Ve...
    yjaal閱讀 1,186評論 1 10
  • 愛上明知是錯誤的人,但就算是重來N次的痛苦不堪,也阻止不了吸引、迷戀、靠近。雖然重來100次,至尊寶也救不了求死的...
    葉遇閱讀 216評論 0 0