JAVA的容器类库,就是JAVA的数据结构。本文主要对List,Map,Set 的应用以及性能进行一番归纳和总结。下图为:容器类之间的层次关系:
Collection 它是最基本的接口;它派生出了子接口List、Set、Queue
├List 有序的Collection;允许含有重复元素
│├LinkedList 链表结构;非同步(线程不安全);允许插入null
│├ArrayList 数组结构;非同步(线程不安全) ;允许插入null
│└Vector 数组结构;同步(线程安全); 允许插入null
└Set 不包含重复元素的Collection
│├TreeSet 自然排序结构; 非同步(线程不安全);不允许插入null
│└HashSet 无序结构;非同步(线程不安全);允许插入null
└ └LinkedHashSet 有序结构;非同步(线程不安全);允许插入null
Map
├TreeMap 自然排序结构; 非同步(线程不安全);不允许使用 null 键
├Hashtable 无序结构;同步(线程安全); 不允许使用 null 值和 null 键
├HashMap 无序结构;非同步(线程不安全);允许使用 null 值和 null 键
└LinkedHashMap 顺序结构;非同步(线程不安全);允许使用 null 值和 null 键
LinkedList、ArrayList、Vector的性能分析,详见代码:
上述程序JDK1.5的输出结果:
----------------这是 arrayList----------------
集合尾部追加数据耗时:109 毫秒
集合顺序访问数据耗时:47 毫秒
集合随机删除数据耗时:1156 毫秒
----------------这是 vector ----------------
集合尾部追加数据耗时:125 毫秒
集合顺序访问数据耗时:125 毫秒
集合随机删除数据耗时:1156 毫秒
----------------这是 linkedList---------------
集合尾部追加数据耗时:313 毫秒
集合顺序访问数据耗时:31 毫秒
集合随机删除数据耗时:5469 毫秒
输出完毕 (耗时 8 秒) - 正常终止
LinkedList、ArrayList、Vector 对比:
1)上述集合类都可以用来持有有序个Object;可以包含重复值;允许null值
2)ArrayList、LinkedList非线程安全、Vector线程安全
3)ArrayList内部使用的数组实现,随机查找速度较快,不适合在中间位置插入或删除数据,因为在集合的中间位置插入或删除数据之后,将导致此位置之后的数据全部移动,消耗性能。
4)LinkedList顺序查找速度较快、插入或者删除数据速度一般
总结:不考虑线程安全:建议使用ArrayList,除非经过实践证明LinkedList可以拥有更好的性能。考虑线程安全,则需要使用Vector
备注:线程不安全的集合也可以通过Collections.synchronizedMap()、synchronizedList() 和 synchronizedSet())表现为线程安全的集合类
HashSet、LinkedHashSet、TreeSet的性能分析,详见代码:
上述程序JDK1.5的输出结果:
----------------这是 HashSet-----------------
集合尾部追加数据耗时:484 毫秒
集合顺序访问数据耗时:31 毫秒
集合随机删除数据耗时:0 毫秒
----------------这是 LinkedHashSet-----------
集合尾部追加数据耗时:485 毫秒
集合顺序访问数据耗时:15 毫秒
集合随机删除数据耗时:0 毫秒
----------------这是 TreeSet-----------------
集合尾部追加数据耗时:641 毫秒
集合顺序访问数据耗时:15 毫秒
集合随机删除数据耗时:0 毫秒
输出完毕 (耗时 1 秒) - 正常终止
HashSet、LinkedHashSet、TreeSet 对比:
1)上述集合类都可以用来持有多个不重复的Object;线程不安全
2) HashSet 无序、LinkedHashSet顺序、TreeSet自然排序
3) HashSet 、LinkedHashSet允许null值,而TreeSet不允许null值
4) TreeSet、LinkedHashSet、TreeSet三者性能相当
总结:因为他们都是线程不安全的,多线程情况需要注意。根据排序的不同可以选择不同的Set来满足自己的实际编程需求