这篇文章主要记录两个问题:1、Java集合类的层次结构,如何选择应该使用哪种集合类 2、初步了解集合类线程安全的问题
1、Java集合类剖析
1.1 概述
先上图,Java的集合可以说主要包括两大类Collection和Map,其中Collection包括顺序结构的List和无重复元素的Set。
图中主要关注的类有以下,我们平常用到的可以简单分为List、Set和Map
Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set
Map
├Hashtable
├HashMap
└WeakHashMap
常用的实现类有ArrayList和LinkedList。List做为接口类,它的主要特点是保证集合中的数据是顺序的,List为Collection添加了大量方法。其中需要注意的是List生成了一个ListIterator,可以双向遍历,只建议对LinkedList这么做。
一般来说,需要在列表中间进行频繁的插入删除操作,用LinkedList效率较高,反正随机访问较多的可以用ArrayList。
1.3 Set
首先需要明白,加入Set里的值必须定义equals()方法保证对象唯一,Set基本等于一个Collection,区别在于Set的值不重复,主要有HashSet和TreeSet。其中对查找效率要求高的话用HashSet,对象需定义hashCode()方法。TreeSet是由红黑树后推得到的,放入TreeSet中的对象必须实现Comparable接口,由TreeSet能够得到一组顺序的值。
在往Set中插入对象时,首先会调用hashCode()看Set中是否已存在,如果存在就不能插入,不存在的话再调用equals()方法判断,为false才可以插入。
在ArraySet(备注1)t和HashSet之间做比较,取决于Set的大小,如果非常小,选用ArraySet,不过几乎用不到
1.4 Map
Map为键值对的结构,其中key是一个Set,值是一个List,这样就很好理解key是不能重复的,而值是可以重复的。Map分为HashTable、HashMap和TreeMap。同ArraySet一样,也存在ArrayMap,不做考虑。TreeMap底层实现也是红黑树,它是唯一含有subMap()方法的Map,利用它可以返回树的一部分。
首选HashMap,TreeMap由于创建速度特别快,如果需要创建大量的TreeMap,并且以后需要检索,就可以采取先创建TreeMap,检索量增大的时候讲重要的TreeMap转换为HashMap。
备注1:Java编程思想有提到,不是java.util包里面的对象,是oracle.olapi.ArraySet包里的,
详见:http://docs.oracle.com/cd/B28359_01/olap.111/b28128/oracle/olapi/ArraySet.html
1.4 排序和检索
Collections和Arrays的静态方法可以提供排序和二分查找算法,以及最大值最小值等大量工具算法
创建不可修改的Collection可以使用Collections.unmodifiableCollection(Collection c)、unmodifiableList()、unmodifiableSet()、unmodifiableMap()方法
2、集合类线程安全
2.1 概况
Collections工具类提供对整个容器进行线程同步的一个途径,即调用synchronizedCollection()方法
老的集合类HashTable、Vector、Enumeration是线程安全的,不用考虑线程安全问题
Java5新加入的ConcurrentLinkedQueue、ConcurrentHashMap、CopyOnWriteArrayList和CopyOnWriteArraySet是线程安全的
2.2 Java并发集合类文章
http://www.ibm.com/developerworks/cn/java/j-jtp07233/