Java集合类

这篇文章主要记录两个问题: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

1.2 List

常用的实现类有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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值