会写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 。

刚开始学舞剑可能会伤到本身,可是你不学你永远不会用剑。技术没什么难的,难的是就怕你不知道。

原创不易,求分享,点个在看,关注,素质三连,谢谢支持。

每日一句

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

相关文章
相关标签/搜索