会写Java,不一定会用Collections,你会用吗

简介: 今天写一下 Collections,这是Java官方提供的针对集合类的工具类,也是在开发中的一把利刃,能帮我们解决很多开发中的问题,但是依然有很多人不会或者不了解其中的API,一起学习下。

今天写一下 Collections,这是Java官方提供的针对集合类的工具类,也是在开发中的一把利刃,能帮我们解决很多开发中的问题,但是依然有很多人不会或者不了解其中的API,一起学习下。


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


ce413f19cf2641e1859ce3e8c150bee4~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg

 

这可能是初学者遇到的问题,三个都和collect相关的。其中的分别也很简单。


1.Collectors 主要是用在java stream 中,是用来最后处理stream的,比如 Collectors.toSet()。


2.Collection 是所有集合类的相关的接口类,比如常用的Set,List,Map。


3.Collections 是Java官方的提供的工具类,今天重点来讲一下。


  可以根据单词来记忆,Collectors 收集器。Collection 集合 。Collections 一堆集合操作。


2.Collections中API的分类


313b74fb7a5f46deb788f61f10876f85~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg

2.1 排序操作


static <T>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处元素进行交换
以上都比较简单,在用的时候看一下就会明白。
复制代码


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 。


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



目录
相关文章
|
SQL Java
解读JAVA处理排名问题-关于学生成绩排名及Collections中的sort方法与Comparable的使用
写一个项目真是存在很多的bug,修复的时间往往比开发所需要的时间更长,今天又出了一个bug,在这里记录一下,主要是针对系统中学生的成绩排名。
162 0
|
11天前
|
安全 架构师 Java
Java大厂面试高频:Collection 和 Collections 到底咋回答?
Java中的`Collection`和`Collections`是两个容易混淆的概念。`Collection`是集合框架的根接口,定义了集合的基本操作方法,如添加、删除等;而`Collections`是一个工具类,提供了操作集合的静态方法,如排序、查找、同步化等。简单来说,`Collection`关注数据结构,`Collections`则提供功能增强。通过小王的面试经历,我们可以更好地理解这两者的区别及其在实际开发中的应用。希望这篇文章能帮助你掌握这个经典面试题。
29 4
|
2月前
|
存储 安全 Java
java.util的Collections类
Collections 类位于 java.util 包下,提供了许多有用的对象和方法,来简化java中集合的创建、处理和多线程管理。掌握此类将非常有助于提升开发效率和维护代码的简洁性,同时对于程序的稳定性和安全性有大有帮助。
89 17
|
6月前
|
存储 安全 Java
Java详解 : 单列集合 | 双列集合 | Collections类
Java详解 : 单列集合 | 双列集合 | Collections类
119 0
|
8月前
|
安全 Java API
【JAVA学习之路 | 进阶篇】Collections工具类
【JAVA学习之路 | 进阶篇】Collections工具类
|
7月前
|
安全 Java
Java 对象创建与使用:你真的会用吗?
【6月更文挑战第15天】在Java中,对象创建涉及`new`关键字和构造器,用于初始化。使用对象时注重属性和方法的访问,遵循命名规范。关注对象生命周期,避免过度创建,如在循环内,以减少内存消耗和提高性能。还要考虑线程安全,尤其在多线程环境下,确保正确同步以防止数据不一致。通过优化对象的创建与使用,提升代码效率和可靠性。
55 0
java——除了new,你还会用supplier创建对象吗?
java——除了new,你还会用supplier创建对象吗?
|
存储 安全 Java
【Java 基础】你真的会用 String 吗?
【Java 基础】你真的会用 String 吗?
93 0
|
8月前
|
安全 算法 Java
Java Collections工具类:常用方法与技巧
Java Collections工具类:常用方法与技巧
119 0
|
8月前
|
存储 Java
从零开始学习 Java:简单易懂的入门指南之可变参数及Collections类(二十五)
从零开始学习 Java:简单易懂的入门指南之可变参数及Collections类(二十五)