Java数据结构(三)——集合总结及集合的线程安全

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/King1425/article/details/70213535
  • Vector,HashTable是线程安全的集合类,不过,这两种类是很早的用法,现在一般要尽量少采用

  • set
    –没有重复项目的集合
    有三种特定类型的集可用
    HashSet-基于散列表的集,加进散列表的元素要实现hashCode()方法
    LinkedHashSet-对集迭代时,按增加顺序返回元素
    TreeSet-基于(平衡)树的数据结构

  • List
    ArrayList(数组表)-类似于Vector,都用于缩放数组维护集合。区别:
    一.同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的
    二.数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半
    LinkedList(链表)-是双向链表,每个节点都有两个指针指向上一节点和下一节点。
    用在FIFO,用addList()加入元素 removeFirst()删除元素
    用在FILO,用addFirst()/removeLast()
    ListIterator提供双向遍历next() previous(),可删除、替换、增加元素

  • Map
    处理Map的三种集合
    关键字集KeySet()
    数值集value()
    项目集enrySet()
    四个具体版本
    HashMap-散列表的通用映射表
    LinkedHashMap-扩展HashMap,对返回集合迭代时,维护插入顺序
    WeakHashMap-基于弱引用散列表的映射表,如果不保持映射表外的关键字的引用,则内存回收程序会回收它
    TreeMap-基于平衡树的映射表

  • Collections类,用于同步集合,还能改变集合只读方式的类

  • Stack类
    是Vector的子类。就是数据结构里讲滥了的堆栈(这个词可简称栈,不要混淆于heap-堆)。后进先出的存取方式。
    Stack()构造空栈
    Empty()叛空
    Search()检查堆栈是否有元素
    Peek()取得栈顶元素
    Pop()弹栈
    Push()入栈
    Enumeration接口
    Dictionary类

易混淆概念

Collection 和 Collections的区别。
Collections是个java.util下的类,它包含有各种有关集合操作的静态方法。
Collection是个java.util下的接口,它是各种集合结构的父接口。
List, Set, Map是否继承自Collection接口? List,Set是 Map不是
ArrayList和Vector的区别。
一.同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的
二.数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半
HashMap和Hashtable的区别
一.历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现
二.同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的
三.值:只有HashMap可以让你将空值作为一个表的条目的key或value

集合的线程安全

Collections类中提供了多个synchronizedXxx,该方法返回指定集合对象对应的同步对象,从而可以解决多线程并发访问集合时的线程安全问题.
正如Java中常用的集合框架推荐使用的三个实现类:HashSet\ArrayList\HashMap都是线程不安全的.如果有多条线程访问它们,而且有超过一条的线程试图修改它们,则可能出现错务.Collections提供了多个静态方法用于创建同步集合
下面程序创建了四个同步的集合对象

import java.util.*;
public class  TestSynchronized
{
public static void main(String[] args)
{
 //下面程序创建了四个同步的集合对象
 Collection c=Collections.synchronizedCollection(new ArrayList());
 List list=Collections.synchronizedList(new ArrayList());
 Set s=Collections.synchronizedSet(new HashSet());
 Map m=Collections.synchronizedMap(new HashMap());
}
}

CopyOnWriteArrayList是ArrayList 的一个线程安全的变体,其中所有可变操作(add、set等等)都是通过对底层数组进行一次新的复制来实现的。

但是CopyOnWriteArrayList在线程对其进行变更操作的时候,会拷贝一个新的数组以存放新的字段,因此写操作性能很差;而Collections.synchronizedList读操作采用了synchronized,因此读性能较差。

ConcurrentSkipListMap 和 ConcurrentSkipListSet
JCIP 提到了在 Java 6 中引入了两个新的并发集合类 ConcurrentSkipListMap 和 ConcurrentSkipListSet。其实只要介绍一下 ConcurrentSkipListMap 即可(后面简称为 CSLM),因为我们都知道 JDK 中 Set 是基于 Map 实现的。简而言之,CSLM 是一个并发的、可排序的 Map,因此它可以在多线程环境中弥补 ConcurrentHashMap 不支持排序的功能不足。从名字上就可以看出 CSLM 是基于 SkipList 跳表实现。学过算法的同学应该对跳表不陌生。不过还是要简单说一下跳表。

跳表是一种采用了用空间换时间思想的数据结构。它会随机地将一些节点提升到更高的层次,以创建一种逐层的数据结构,以提高操作的速度。

Java ConcurrentModificationException 异常分析与解决方案

集合并发新API

Java 并发工具包 java.util.concurrent 用户指南 :http://blog.csdn.net/defonds/article/details/44021605/

Java 7 并发编程指南中文版

猜你喜欢

转载自blog.csdn.net/King1425/article/details/70213535