前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >集合补充

集合补充

作者头像
晚上没宵夜
发布2020-03-10 10:49:23
3460
发布2020-03-10 10:49:23
举报
文章被收录于专栏:Howl同学的学习笔记

集合工具类在java.util下,此类仅由静态方法组合或返回集合。

它包含对集合进行操作的多态算法,“包装器”,返回由指定集合支持的新集合。

如果提供给它们的集合或类对象为null,则此类的方法都抛出一个NullPointerException

1. 工具类

1.1 排序

返回值

方法

解释

void

reverse(List<?> list)

反转元素的顺序

void

sort(List list)

排序

void

sort(List list, Comparator<? super T> c)

根据比较器排序

void

swap(List<?> list, int i, int j)

交换元素位置

1.2 查找和替换

针对的是Collection接口

返回值

方法

解释

int

binarySearch(List list, Object key)

二分查找返回索引,前提是用sort排好序了

void

copy(List dest, List src)

将所有元素从一个list复制到另一个list

void

fill(List list, T obj)

填充

int

frequency(Collection c, Object o)

指定元素出现的次数

int

indexOfSubList(List source, List target)

返回第一次出现的位置

1.3 同步

返回值

方法

解释

List

synchronizedList(List list)

返回同步集合

Set

synchronizedSet(Set set)

返回同步集合

Map

synchronizedMap(Map map)

返回同步集合

这里同步其实就是在每个方法里面加synchronized ,同一个对象锁(final Object mutex),用了装饰者模式,现在不推荐使用了,下面列举一个例子

代码语言:javascript
复制
static class SynchronizedCollection<E> implements Collection<E>, Serializable {

        final Collection<E> c;  // Backing Collection
        final Object mutex;     // Object on which to synchronize

        //装饰器,获取被装饰对象
        SynchronizedCollection(Collection<E> c) {
            this.c = Objects.requireNonNull(c);
            mutex = this;
        }

        //装饰功能,加了锁,调用子类方法
        public int size() {
            synchronized (mutex) {return c.size();}
        }
}

如果用到Iterator迭代器,需要自行加锁,因为这个上面没有加锁

代码语言:javascript
复制
synchronized (list) {
    Iterator i = list.iterator(); // Must be in synchronized block
    while (i.hasNext()) {
        //foo(i.next());
        System.out.println(i.next());
    }
}

2. JUC并发包

java.util.concurrent,下面试着随便说说ConcurrentHashMap

  • 1.7用Segment分段锁,1.8用部分锁,下面用1.8讲解
  • 采用数组+链表+红黑树的数据结构
  • synchronized只锁定当前链表或红黑二叉树的首节点,这样只要hash不冲突,就不会产生并发,提高并发,不是锁整个表
  • 检索操作不用加锁,get方法是非阻塞的
  • key和value都不允许为null
  • 采用 锁头部 + CAS 实现
  • CAS无锁算法,使用volatile保证可见性,然后对比当前值与内存是否相等,相等才修改,多个线程对同一变量修改时,只有一个能成功

​ 网络图(侵删)

3. 数组转集合

返回值

方法名

解释

List

Arrays.asList(T... a)

返回数组的List集合

  • 若传参是普通类型的数组,List会把整个数组放到第一个元素里
  • 返回指定数组的固定大小的List,而且不能改变结构,因为此处的List不是util下的,是Arrays下的,没有实现增删元素
  • 若要互转 List list= new ArrayList( Arrays.asList(array) )

4. 迭代

如果不是并发的集合,迭代的时候不允许修改结构,会有快速失败机制,这个机制尽可能抛出并发修改错误,但不保证成功

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-01-17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 工具类
    • 1.1 排序
      • 1.2 查找和替换
        • 1.3 同步
        • 2. JUC并发包
        • 3. 数组转集合
          • 4. 迭代
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档