同事說會寫Java,不一定會用Collections,你會用嗎?

前言

今天和同事聊天,同事說好多人都說自己是java高級程序員,結果問一個 Collections的用法,他沉默了。

我說這不能怪他啊,我們是人,我們學習到的知識可能會忘掉,有可能以前知道,過了一段時間就全忘了。

所以,今天我們就來聊聊Collections。

同事說會寫Java,不一定會用Collections,你會用嗎?


Collections

Collections是Java官方提供的針對集合類的工具類,也是在開發中的一把利刃,能幫我們解決很多開發中的問題,但是依然有很多人不會它的用法,一起來學習一下吧。

Collectors,Collection,Collections

這三兄弟有什麼區別呢:

  • 1.Collectors 主要是用在java stream 中,是用來最後處理stream的,比如 Collectors.toSet()。
  • 2.Collection 是所有集合類的接口類,比如常用的Set,List,Map。
  • 3.Collections 是Java官方的提供的工具類,今天重點來講一下。

小技巧:可以根據單詞來記憶,Collectors 收集器。Collection 集合 。Collections 一堆集合操作。

同事說會寫Java,不一定會用Collections,你會用嗎?

Collections中API的分類


同事說會寫Java,不一定會用Collections,你會用嗎?

排序操作

static boolean addAIl(Collection super T>c,T... elements)

將所有指定元素添加到指定的collection中

static void reverse(List list)

反轉指定List集合中元素的順序

static void shuffle(List list)

對List集合中的元素進行隨機排序(模擬玩撲克中的“洗牌”)

static void sort(List list)

根據元素的自然順序對List集合中的元素進行排序

static void swap(List list,int i,int j)

將指定List集合中i處元素和j處元素進行交換

以上都比較簡單,在用的時候看一下就會明白

查找替換

static int binaryScarch ( List list,Object key)

使用二分法搜索指定對象在List集合中的索引,查找的 List集合中的元素必須是有序的

static Object max(Collection col)

返回給定集合中最大的元素

static Object min (Collection col)

返回給定集合中最小的元素

static boolean replaccAll (List list,Object oldVal,Object newVal)用一個新的newVal替換List集合中所有的舊值oldVal

checkedxxx 檢查集合

返回類型檢查的集合,在對類型進行set 或者add的時候會做類型檢查

用法:

ArrayList list = Lists.newArrayList();

list.add(new Player("香菜"));

// 返回的safeList 在add時會進行類型檢查

List safeList = Collections.checkedList(list, Player.class);

//此時會對類型進行檢查,不是Player類型,拋出異常
java.lang.ClassCastException:

safeList.add("xxx");

源碼解析:

public void add(E e) {

i.add(typeCheck(e));

}

E typeCheck(Object o) {

if (o != null && !type.isInstance(o))

throw new ClassCastException(badElementMsg(o));

return (E) o;

}

這一組的函數可以在開發中多用,儘量避免因為不小心或者因為多人合作的原因出現一些異常。

emptyxxx 返回空的集合

這個操作有點騷,就是直接返回一個空集合,不能添加,不能刪除,這個東西會有什麼用吶?

用法:

/**

* 查詢 和我同公會的好友

*/

public List getSameUnionFriend(int roleId,int uid){

// 如果當前玩家沒有工會,直接返回空list

if (uid == 0){

return Collections.emptyList();

}

// todo ....

}

這樣用的好處就是1.不用處理返回null的問題。2.不用新生成空的list,避免佔用內存,因為返回的空list,整個應用共同用一個。你發現他的好處了嗎?

源碼解析:

public static final List EMPTY_LIST = new EmptyList<>();

synchronizedxxx 同步集合

用法:

ArrayList list = Lists.newArrayList();

// TODO;-----

List synList = Collections.synchronizedList(list);

將傳入的集合進行同步。解決線程同步問題。

源碼:

final Object mutex; // Object on which to synchronize

public void add(int index, E element) {

synchronized (mutex) {list.add(index, element);}

}

這種方式相當於對集合進行了二次包裝,在內部加了一把鎖。

注意:這樣的加鎖方式會產生問題,如果是集合的單個操作是沒有問題的,如果想同步集合狀態下做一些非元操作是有問題的。還是要使用synchronize(list),小心使得萬年船。

unmodifiableXxx 不可變集合

用法:傳入的集合返回後不可以改變。

ArrayList list = Lists.newArrayList();

// TODO;-----

List synList = Collections.unmodifiableList(list);

源碼:

public E set(int index, E element) {

throw new UnsupportedOperationException();

}

public void add(int index, E element) {

throw new UnsupportedOperationException();

}

public E remove(int index) {

throw new UnsupportedOperationException();

}

傳入的集合不可以改變。因為包裝類屏蔽了集合的方法,拋出了異常。

注意:只是不可以修改list的內容,但是可以修改list內元素的內容。比如下面:

ArrayList list = Lists.newArrayList();

list.add(new Player("香菜聊遊戲"));

List synList = Collections.unmodifiableList(list);

Player player = synList.get(0);

player.setName("蘿蔔");

總結

Collections 支持單個元素的除集合外提供的泛型操作。

如果你想同步集合,請用synchronizedxxx 。

如果你不想修改集合,請用unmodifiableXxx 。

如果你想使用空集合,請用emptyXxx。

如果你想保持集合純淨,請用 checkedxxx 。

同事說會寫Java,不一定會用Collections,你會用嗎?


完!


分享到:


相關文章: