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

举报
香菜聊游戏 发表于 2021/07/15 01:13:04 2021/07/15
【摘要】 目录 1.Collectors,Collection,Collections傻傻分不清楚 2.Collections中API的分类 2.1 排序操作 2.2 查找替换 2.3 checkedxxx 检查集合 2.4 emptyxxx 返回空的集合 2.5 synchronizedxxx 同步集合 2.6 unmodifiableXxx 不可变集合 3.总...

目录

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

2.Collections中API的分类

2.1 排序操作

2.2 查找替换

2.3 checkedxxx 检查集合

2.4 emptyxxx 返回空的集合

2.5 synchronizedxxx 同步集合

2.6 unmodifiableXxx 不可变集合

3.总结:


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

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

 

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

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

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

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

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

2.Collections中API的分类

2.1 排序操作


  
  1. static <T>boolean addAIl(Collection <? super T>c,T... elements)
  2. 将所有指定元素添加到指定的collection中
  3. static void reverse(List list
  4. 反转指定List集合中元素的顺序
  5. static void shuffle(List list)
  6. List集合中的元素进行随机排序(模拟玩扑克中的“洗牌”)
  7. static void sort(List list)
  8. 根据元素的自然顺序对List集合中的元素进行排序
  9. static void swap(List list,int i,int j) 
  10. 将指定List集合中i处元素和j处元素进行交换
  11. 以上都比较简单,在用的时候看一下就会明白。

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的时候会做类型检查

  用法:


  
  1.       ArrayList list = Lists.newArrayList();
  2.       list.add(new Player("香菜"));
  3.       // 返回的safeList 在add时会进行类型检查
  4.       List safeList = Collections.checkedList(list, Player.class);
  5.       //此时会对类型进行检查,不是Player类型,抛出异常 java.lang.ClassCastException:
  6.       safeList.add("xxx");

源码解析:


  
  1.       public void add(E e) {
  2.                   i.add(typeCheck(e));
  3.               }
  4.       E typeCheck(Object o) {
  5.           if (o != null && !type.isInstance(o))
  6.               throw new ClassCastException(badElementMsg(o));
  7.           return (E) o;
  8.       }

这一组的函数可以在开发中多用,尽量避免因为不小心或者因为多人合作的原因出现一些异常。

2.4 emptyxxx 返回空的集合

这个操作有点骚,就是直接返回一个空集合,不能添加,不能删除,这个东西会有什么用呐?

用法:


  
  1.     /**
  2.     * 查询 和我同公会的好友
  3.     */
  4.   public List<Player> getSameUnionFriend(int roleId,int uid){
  5.       // 如果当前玩家没有工会,直接返回空list
  6.       if (uid == 0){
  7.           return Collections.emptyList();
  8.       }
  9.       // todo ....
  10.   }

这样用的好处就是1.不用处理返回null的问题。2.不用新生成空的list,避免占用内存,因为返回的空list,整个应用共同用一个。你发现他的好处了吗?

源码解析:

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

2.5 synchronizedxxx 同步集合

用法:


  
  1.   ArrayList<Player> list = Lists.newArrayList();
  2.       // TODO;-----
  3.       List<Player> synList = Collections.synchronizedList(list);

将传入的集合进行同步。解决线程同步问题。

源码:


  
  1. final Object mutex;     // Object on which to synchronize
  2. public void add(int index, E element) {
  3.           synchronized (mutex) {list.add(index, element);}
  4.       }

这种方式相当于对集合进行了二次包装,在内部加了一把锁。

注意:这样的加锁方式会产生问题,如果是集合的单个操作是没有问题的,如果想同步集合状态下做一些非元操作是有问题的。还是要使用synchronize(list),小心使得万年船。

2.6 unmodifiableXxx 不可变集合

用法:传入的集合返回后不可以改变。


  
  1. ArrayList<Player> list = Lists.newArrayList();
  2.       // TODO;-----
  3.       List<Player> synList = Collections.unmodifiableList(list);

源码:


  
  1. public E set(int index, E element) {
  2.           throw new UnsupportedOperationException();
  3.       }
  4.       public void add(int index, E element) {
  5.           throw new UnsupportedOperationException();
  6.       }
  7.       public E remove(int index) {
  8.           throw new UnsupportedOperationException();
  9.       }

传入的集合不可以改变。因为包装类屏蔽了集合的方法,抛出了异常。

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


  
  1. ArrayList<Player> list = Lists.newArrayList();
  2.       list.add(new Player("香菜聊游戏"));
  3.       List<Player> synList = Collections.unmodifiableList(list);
  4.       Player player = synList.get(0);
  5.       player.setName("香菜");

3.总结:

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

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

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

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

如果你想保持集合纯净,请用 checkedxxx 。

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

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

 

文章来源: gamwatcher.blog.csdn.net,作者:香菜聊游戏,版权归原作者所有,如需转载,请联系作者。

原文链接:gamwatcher.blog.csdn.net/article/details/105566196

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。