Collection基础笔记

Collections常用方法:

public static <T> boolean addAll(Collection<? super T> c, T... elements)//往集合中添加一些元素

public static void shuffle(List<?> list)//打乱集合顺序

public static <T extends Comparable<? super T>> void sort(List<T> list)//对集合排序
//自定义类使用方法:首先自定义类要实现comparable<E>接口,这里泛型写自己的类即可,其次要重写compareTo方法,例:return o.getAge()-this.getAge()为按年龄降序,顺序颠倒即为升序

public static <T> void sort(List<T> list, Comparator<? super T> c)//对集合排序
使用例子:Collections.sort(persons, new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                return o1.getAge()-o2.getAge();
            }
        });

HashMap

对于Map系列,HashMap和Hashtable最常用, Hashtable 是将数组&链表完美结合起来的数据结构, 外层数据结构是Entry数组,Entry内部有个指针(引用)指向下一个Entry,这样就形成一个链表。Hashtable中元素在数组的位置是计算出来的:计算器key的Hash值,然后与数组长度取余获得在数组位置,如果此位置已经有Entry(hash值相同),那么就直接插入在这数组位置,并让Entry的next指向之前的数组位置的Entry。 Hashtable和HashMap的最大差别是Hashtable是线程安全的。

LinkedHashMap就是在HashMap基础上加入链表记录写入顺序以便可以按顺序读出。

 

集合的线程安全:

1、通过使用Collections中的方法将线程不安全的集合转变为线程安全的集合:

直接添加synchronized代码块,所以效率低下,现在几乎不使用。

ArrayList<String> arrayList = new ArrayList<String>();
List<String> syncList = Collections.synchronizedList(arrayList);

2、使用CopyOnWriteArrayList【线程安全的List】

CopyOnWriteArrayList中对写( set(),add(),remove() )的方法加了重入锁,在读( get() )的方法中没有加锁,从而保证了一定的效率。

另外在写的过程中是要每次在写的过程中都要重新copy一份新的数组,所以事实上是用空间换取安全性。

CopyOnWriteArrayList<String> copyOnWriteArrayList = new CopyOnWriteArrayList<String>();

3、使用CopyOnWriteArraySet【线程安全的Set】

底层是通过CopyOnWriteArrayList来实现的,与之不同的是使用 addIfAbsent() 添加元素,遍历数组,判断( equals() )是否存在该元素,如存在元素则不添加(扔掉副本)来保证没有重复。

还要注意因为底层是CopyOnWriteArrayList实现的,所以也是有序的。

Queue

是Collection的子接口,表示队列(FIFO)

1、ConcurrentLinkedQueue(非阻塞队列)

是Queue的一个实现类,线程安全,高并发下性能最佳,无锁,采用CAS比较交换算法,修改方法包括三个核心参数(V, E, N)只有当要更新的值V==预期值E时,才将新值N赋值给V。

2、BlockingQueue(阻塞队列)

是Queue的一个子接口, 可用于生产者,消费者案例

具体实现有:

ArrayBlockingQueue 数组结构实现,需要手动指定队列大小  

ArrayBlockingQueue<String> arrayBlockingQueue = new ArrayBlockingQueue<String>(10);

LinkedBlockingQueue 链表结构实现,大小为:Integer.MAX_VALUE

LinkedBlockingQueue<String> linkedBlockingQueue = new LinkedBlockingQueue<String>();

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值