這是系列的第四篇,不容易,總算還在軌道上。 java
今天寫一下 Collections,這是Java官方提供的針對集合類的工具類,也是在開發中的一把利刃,能幫咱們解決不少開發中的問題,可是依然有不少人不會或者不瞭解其中的API,一塊兒學習下。函數
這多是初學者遇到的問題,三個都和collect相關的。其中的分別也很簡單。工具
1.Collectors 主要是用在java stream 中,是用來最後處理stream的,好比 Collectors.toSet()。學習
2.Collection 是全部集合類的接口類,好比經常使用的Set,List,Map。ui
3.Collections 是Java官方的提供的工具類,今天重點來說一下。spa
能夠根據單詞來記憶,Collectors 收集器。Collection 集合 。Collections 一堆集合操做。線程
static <T>boolean addAIl(Collection <? super T>c,T... elements)對象
將全部指定元素添加到指定的collection中blog
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
返回類型檢查的集合,在對類型進行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;
}
這一組的函數能夠在開發中多用,儘可能避免由於不當心或者由於多人合做的緣由出現一些異常。
這個操做有點騷,就是直接返回一個空集合,不能添加,不能刪除,這個東西會有什麼用吶?
用法:
/**
* 查詢 和我同公會的好友
*/
public List<Player> 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<>();
用法:
ArrayList<Player> list = Lists.newArrayList();
// TODO;-----
List<Player> 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),當心使得萬年船。
用法:傳入的集合返回後不能夠改變。
ArrayList<Player> list = Lists.newArrayList();
// TODO;-----
List<Player> 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<Player> list = Lists.newArrayList();
list.add(new Player("香菜聊遊戲"));
List<Player> synList = Collections.unmodifiableList(list);
Player player = synList.get(0);
player.setName("香菜");
Collections 支持單個元素的除集合外提供的泛型操做。
若是你想同步集合,請用synchronizedxxx 。
若是你不想修改集合,請用unmodifiableXxx 。
若是你想使用空集合,請用emptyXxx。
若是你想保持集合純淨,請用 checkedxxx 。
剛開始學舞劍可能會傷到本身,可是你不學你永遠不會用劍。技術沒什麼難的,難的是就怕你不知道。
原創不易,求分享,點個在看,關注,素質三連,謝謝支持。
每日一句
對世俗投以白眼,但又不奈何與其同流合污。