會寫Java,不必定會用Collections,你會用嗎

這是系列的第四篇,不容易,總算還在軌道上。 java

今天寫一下 Collections,這是Java官方提供的針對集合類的工具類,也是在開發中的一把利刃,能幫咱們解決不少開發中的問題,可是依然有不少人不會或者不瞭解其中的API,一塊兒學習下。函數

1.Collectors,Collection,Collections傻傻分不清楚

這多是初學者遇到的問題,三個都和collect相關的。其中的分別也很簡單。工具

1.Collectors 主要是用在java stream 中,是用來最後處理stream的,好比 Collectors.toSet()。學習

2.Collection 是全部集合類的接口類,好比經常使用的Set,List,Map。ui

3.Collections 是Java官方的提供的工具類,今天重點來說一下。spa

   能夠根據單詞來記憶,Collectors 收集器。Collection 集合 。Collections 一堆集合操做。線程

2.Collections中API的分類

2.1 排序操做

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處元素進行交換

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

2.2 查找替換

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

2.3 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;
      }

這一組的函數能夠在開發中多用,儘可能避免由於不當心或者由於多人合做的緣由出現一些異常。

2.4 emptyxxx 返回空的集合

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

用法:

    /**
    * 查詢 和我同公會的好友
    */
  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<>();

2.5 synchronizedxxx 同步集合

用法:

      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),當心使得萬年船。

2.6 unmodifiableXxx 不可變集合

用法:傳入的集合返回後不能夠改變。

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("香菜");

3.總結:

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

若是你想同步集合,請用synchronizedxxx 。

若是你不想修改集合,請用unmodifiableXxx 。

若是你想使用空集合,請用emptyXxx。

若是你想保持集合純淨,請用 checkedxxx 。

剛開始學舞劍可能會傷到本身,可是你不學你永遠不會用劍。技術沒什麼難的,難的是就怕你不知道。

原創不易,求分享,點個在看,關注,素質三連,謝謝支持。

每日一句

對世俗投以白眼,但又不奈何與其同流合污。

相關文章
相關標籤/搜索