開心一笑
【一帶孩的媽說,她最喜歡的狀態(tài)是:
枯藤老樹昏鴉,空調(diào)WiFi西瓜。
葛優(yōu)同款沙發(fā)、夕陽西下,我就往那一趴!一趴!一趴!誰也別叫我!
最不想聽到有人叫我“媽……”】
視頻教程
大家好,我錄制的視頻《Java之優(yōu)雅編程之道》已經(jīng)在CSDN學(xué)院發(fā)布了,有興趣的同學(xué)可以購買觀看,相信大家一定會收獲到很多知識的。謝謝大家的支持……
視頻地址:http://edu.csdn.net/lecturer/994
提出問題
項目開發(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ù)傳遞下去,歡迎點贊、頂、歡迎留下寶貴的意見、多謝支持!