JAVA集合分析概述

标签: java 集合 分析 | 发表时间:2013-02-22 14:34 | 作者:
出处:http://www.iteye.com

       前段时间在QQ空间写了篇关于JAVA集合分析的日志,现搬到这里与大家分享。 其中有链接可查看各种集合的具体介绍。

http://user.qzone.qq.com/396768440/blog/1359132442

 

 最基本的数据结构有数组、链表2种。
        1)数组的长度是固定的,容量是有限的(除非扩容)。可以用索引访问,因此访问速度比较快。
        2)链表中每个节点指向下一个节点,容量是无限的(不作限制且不考虑硬件)。访问链表中的任一节点需要遍历链,因此访问速度比较慢。
        
        JAVA集合内部使用这2种结构中的1种或2种来保存数据,基本接口有:Map和Collection。Collection下有List、Queue、Set这3个接口。

  • Map用于保存多个键值对,键不能重复。其中部分实现类(线程安全、key有序、key枚举)的键不能为空。
  • Collection用于保存一组对象,分为3种接口。
    • List列表,对象可重复、可空。
    • Queue队列,对象可重复、不能空,添加一些操作方法。
    • Set对象不能重复。
        类图如下,其中圆表示接口、方形表示类,斜体描述的方形表示抽象类,蓝色边框表示JDK1.5以后出现的。


Map 
图片
图1.1:Map类图
实现类
HashMap: 最常用的Map,线程不安全,没有多线程同时访问的情况,使用HashMap效率最高。内部使用数组保存节点,数组中的元素可为空,也可为链表。
LinkedHashMap:保存了插入顺序,用Iterator遍历时,按插入时的顺序返回。是HashMap的子类,并用双向链表将节点按进入顺序连接。
TreeMap:key是有序的,纯种不安全,使用红黑树保存节点。
ConcurrentHashMap:线程安全,不是锁整个Map对象,而使用ReentrantLock锁相应的segment,效率比Hashtable高。
ConcurrentSkipListMap:key是有序的,适合多线程的高并发。用有序的链保存数据,为节点建立N层索引,定位节点类似二分查找法。
Hashtable:线程安全,put、get、remove方法用synchronized锁住整个对象,效率比较低。
EnumMap:key是枚举值。 
WeakHashMap:key在外部没有引用时,该key的键值可被GC回收。
IdentityHashMap:判断key值相等时,用key1==key2判断,而不是equals。所以key可以是值相等的不同对象。
Properties:主要用于读取properties或XML配置文件,线程安全。
名称
数据结构
线程安全
 key有序 
 key可空 
  明细  
 HashMap
 数组+链表(hash表)
 LinkedHashMap
 数组+链表
 TreeMap
 链(红黑树)
 ConcurrentHashMap
 数组+数组+链表(分段hash表)  
 是 
 ReentrantLock  
 ConcurrentSkipListMap 
 链表+索引链(跳表)
CAS
 Hashtable
 数组+链表
 synchronized  
 EnumMap
 数组+数组
 WeakHashMap
 数组+链表
 IdentityHashMap
 数组+链表
表1.1 各种Map比较

List 、Queue
 
图片
图1.2:List、Queue类图 
接口
List:列表接口
        1)add:添加元素。
        2)remove:删除指定元素。
        3)get:返回指定元素。
Queue:所有队列的接口
        1)add:添加元素到队列,如果没有空间则抛出异常。
        2)remove:从队列中删除元素。
        3)poll:取走头元素,如果队列为空,则返回null。
        4)peek:返回头元素,如果队列为空,则返回null。
        5)element:返回头元素,如果队列为空,则抛出异常。
BlockingQueue:可阻塞队列的接口
        1)add:添加元素到队列,如果没有空间则抛出异常。
        2)put:添加元素到队列,如果没有空间则阻塞等待直到有空间。
        3)take:取走头元素,如果队列为空,则阻塞等待直到有元素。
        4)poll :取走头元素,如果队列为空,则在超时时长范围内阻塞等待,超时后仍未取到则返回null。

实现类
ArrayList:最常用的List,线程不安全,内部是数组结构。
CopyOnWriteArrayList:线程安全,修改(add、remove)数组将复制一个新的数组来修改再设置回去,适合读远多于写。
LinkedList:线程不安全,内部是链表结构。
Vector:线程安全,用synchronized锁住addElement、get整个方法,效率较低。
Stack:是Vector的子类,可先进先出,用来实现栈。
ConcurrentLinkedQueue:效率最高的线程安全队列。
PriorityQueue:有优先级的队列,线程不安全。
PriorityBlockingQueue:有优先级的队列,线程安全。
ArrayBlockingQueue:有界的阻塞的数组队列,数组被占满后不能自动扩容。数组已满再加元素,add抛出异常,put阻塞等待。
LinkedBlockingQueue:有界的阻塞的链表队列。
ArrayDeque:双向数组队列,线程不安全。
LinkedBlockingDeque:双向阻塞队列。
SynchronousQueue:无缓冲的等待队列,用于数据交换。
DelayQueue:延时队列,延时时间到期后才出队列。


名称
数据结构
线程安全
 可阻塞 
 容量有限 
 元素可空 
  明细  
 ArrayList
 数组
 LinkedList
 链表(双向)  
 Vector
 数组
synchronized
 
 Stack
 数组
 是 
synchronized
 ConcurrentLinkedQueue  
 链表
CAS
 PriorityQueue
 数组
 PriorityBlockingQueue
 数组
 ReentrantLock  
 是 
Condition
 ArrayBlockingQueue
 数组
ReentrantLock
Condition
 LinkedBlockingQueue
 链表
ReentrantLock
Condition
 ArrayDeque
 数组(双向)
 LinkedBlockingDeque
 链表(双向)
ReentrantLock
Condition
 SynchronousQueue
 -
CAS
 LockSupport   
 DelayQueue
 数组
ReentrantLock
Condition
表1.2 各种List、Queue比较
 
Set
 
图片
图1.3:Set类图
实现类
HashSet:无序,使用HashMap实现。
TreeSet:有序,使用TreeMap实现。
ConcurrentSkipListSet:线程安全,使用ConcurrentSkipListMap实现。
CopyOnWriteArraySet:线程安全,适合读远多于写的情况,使用CopyOnWriteArrayList实现。


已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [java 集合 分析] 推荐:

JAVA集合分析概述

- - ITeye博客
       前段时间在QQ空间写了篇关于JAVA集合分析的日志,现搬到这里与大家分享. 其中有链接可查看各种集合的具体介绍.  最基本的数据结构有数组、链表2种.         1)数组的长度是固定的,容量是有限的(除非扩容). 可以用索引访问,因此访问速度比较快.         2)链表中每个节点指向下一个节点,容量是无限的(不作限制且不考虑硬件).

Java 集合类学习

- - CSDN博客推荐文章
二、 几个比较重要的接口和类简介. 1、List(有序、索引、可重复).      List里存放的对象是有序的,同时也是可以重复的,List关注的是索引,拥有一系列和索引相关的方法.      ArrayList(数组、快速访问).      ArrayList可以理解成一个可增长的数组,因此可以通过索引快速访问.

[Java] Java 多线程案例分析

- - V2EX
现要从 hbase中导出 2016 年整年的,大约 10w只股票行情数据,数据总量约 100t. 汇总到 hdfs中供需求方使用. 已知数据量规模大概是 100t,那么单台机器处理肯定不是不行的,先不说大多数磁盘都没这么大,即便磁盘有这么大,单台机器处理对于内存和 cpu 要求也很高,所以我们将问题一般化,使用数量有限的低配机器.

java线程池分析

- - BlogJava-首页技术区
    在Java 5.0之前启动一个任务是通过调用Thread类的start()方法来实现的,任务的提于交和执行是同时进行的,如果你想对任务的执行进行调度或是控制 同时执行的线程数量就需要额外编写代码来完成. 5.0里提供了一个新的任务执行架构使你可以轻松地调度和控制任务的执行,并且可以建立一个类似数据库连接 池的线程池来执行任务.

Java ClassLoader原理分析

- - Java - 编程语言 - ITeye博客
一、JDK默认提供的三个ClassLoader. JDK 默认提供了如下几种ClassLoader. Bootstrp加载器是用C++语言写的,它是在Java虚拟机启动后初始化的,它主要负责加载 %JAVA_HOME%/jre/lib, -Xbootclasspath参数指定的路径以及 %JAVA_HOME%/jre/classes中的类.

java集合类多条件排序

- - ITeye博客
已有 0 人发表留言,猛击->> 这里<<-参与讨论. —软件人才免语言低担保 赴美带薪读研.

详细分析Java中断机制

- - 并发编程网 - ifeve.com
本文是作者原创,首发于InfoQ: http://www.infoq.com/cn/articles/java-interrupt-mechanism. 当我们点击某个杀毒软件的取消按钮来停止查杀病毒时,当我们在控制台敲入quit命令以结束某个后台服务时……都需要通过一个线程去取消另一个线程正在执行的任务.

Java可变参数的性能分析

- - Java译站
可变长参数列表是Java 5中的一个新特性. 如果方法需要传入多个同类型参数的话,这个功能就非常有用. 比如说,Java 5之前如果要写一个方法来将所有入参打印到控制台上的话,它的代码会是这样的:. Java 5增加了对可变参数的支持. 这个方法现在看起来就简单多了(译注:这里看起来简单难道不是因为新的for循环.

Java异常的性能分析

- - Java译站
在Java中抛异常的性能是非常差的. 通常来说,抛一个异常大概会消耗100到1000个时钟节拍. 通常是出现了意想不到的错误,我们才会往外抛异常. 也就是说,我们肯定不希望一个进程一秒钟就抛出上千个异常. 不过有时候你确实会碰到有些方法把异常当作事件一样往外抛. 我们在 这篇文章中已经看到一个这样的典范):sun.misc.BASE64Decoder之所以性能很差就是因为它通过抛异常来对外请求道,”我还需要更多的数据“:.

Java静态代码分析工具Infer

- - CSDN博客推荐文章
Java静态代码分析工具Infer. 作者:chszs,转载需注明. 博客主页: http://blog.csdn.net/chszs. Infer是Facebook最新开源的静态程序分析工具,用于在发布移动应用之前对代码进行分析,找出潜在的问题. 目前Facebook使用此工具分析Facebook的App,包括Android、iOS、Facebook Messenger和Instagram等.