集合补充

Posted howlet

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了集合补充相关的知识,希望对你有一定的参考价值。



集合工具类在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),用了装饰者模式,现在不推荐使用了,下面列举一个例子

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迭代器,需要自行加锁,因为这个上面没有加锁

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. 迭代

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




以上是关于集合补充的主要内容,如果未能解决你的问题,请参考以下文章

laravel特殊功能代码片段集合

vs 2010代码片段

vs 2010代码片段

代码: html 页面小效果 (集合,待补充)

js常用代码片段

JavaSE 集合补充点(JDK1.9对集合添加的优化)