会写java_同事说会写Java,不一定会用Collections,你会用吗?

前言

今天和同事聊天,同事说好多人都说自己是java高级程序员,结果问一个 Collections的用法,他沉默了。

我说这不能怪他啊,我们是人,我们学习到的知识可能会忘掉,有可能以前知道,过了一段时间就全忘了。

所以,今天我们就来聊聊Collections。

a5d32ea18e2491fe8982021fa83cd590.png

Collections

Collections是Java官方提供的针对集合类的工具类,也是在开发中的一把利刃,能帮我们解决很多开发中的问题,但是依然有很多人不会它的用法,一起来学习一下吧。

Collectors,Collection,Collections

这三兄弟有什么区别呢:

1.Collectors 主要是用在java stream 中,是用来最后处理stream的,比如 Collectors.toSet()。2.Collection 是所有集合类的接口类,比如常用的Set,List,Map。3.Collections 是Java官方的提供的工具类,今天重点来讲一下。小技巧:可以根据单词来记忆,Collectors 收集器。Collection 集合 。Collections 一堆集合操作。

509f09b57009edfe30cf3cfee8d7638b.png

Collections中API的分类

508bd7791d1a5c1b6dc8ec4c06160767.png

排序操作

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

查找替换

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

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

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

emptyxxx 返回空的集合

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

用法:

/*** 查询 和我同公会的好友*/public List getSameUnionFriend(int roleId,int uid){// 如果当前玩家没有工会,直接返回空listif (uid == 0){return Collections.emptyList();}// todo ....}

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

源码解析:

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

synchronizedxxx 同步集合

用法:

ArrayList list = Lists.newArrayList();// TODO;-----List synList = Collections.synchronizedList(list);

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

源码:

final Object mutex; // Object on which to synchronizepublic void add(int index, E element) {synchronized (mutex) {list.add(index, element);}}

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

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

unmodifiableXxx 不可变集合

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

ArrayList list = Lists.newArrayList();// TODO;-----List 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 list = Lists.newArrayList();list.add(new Player("香菜聊游戏"));List synList = Collections.unmodifiableList(list);Player player = synList.get(0);player.setName("萝卜");

总结

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

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

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

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

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

b4b5d47408340742823bcd2a9b008f73.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值