回忆java来时路-第六章 集合类的演进

来源:互联网 发布:苹果cms论坛 编辑:程序博客网 时间:2024/04/27 15:35
记得早期的java开发者经常使用的集合类是vector和hashtable,它们都是线程安全的,由于同步会消耗资源,因此他们的执行速度要稍慢。很多情况下我们使用集合类并不需要保证线程安全的特性,因此后来又出现了对应的非线程安全的版本ArrayList和HashMap。后来随着concurrent包的加入,又发展出来ConcurrentHashMap等集合类,使我们有了更多的选择,当然性能和安全性上得到综合提高。
1) 先来看看集合类的继承关系树
     从这个图中可以看出,Set和List都继承自共同的Collection接口
     Vector是List的子类
     Map是独立于Collection的接口,也就是说它不支持Collection的一些集合操作(比如iterator)
     
2)然后我们来看看一些具体子类的特性
Map:是一种key-value的健值数据结构
     HashMap:按hash算法存储和访问的map结构,插入和查询速度较快
     TreeMap:保证元素有序存储的map结构,速度上比Hashmap慢点
     Hashtable:线程安全的map实现,因此速度会较慢
     ConcurrentHashMap:并发专用的hashmap,即线程安全,速度也较Hashtable快
List:里面的元素可以重复。
     ArrayList:随机访问和存储,插入相对比较慢,查询相对比较快
     LinkedList:链表结构的存储和访问,插入比较快,查询比较慢
     Vector:和ArrayList类似,不过是线程安全的,效率更低点。
Set:里面的元素都具有唯一性,不会有相同的元素。
     HashSet:内部是通过HashMap来存储和访问,不保证有顺,源代码中map是实际存储的容器。     
     TreeSet:内部是通过NavigableMap来实现,和TreeMap类似,保证存储元素是有序的 

3)各个集合类的访问、插入、自动扩容、缩容。
     Vector、ArrayList、HashSet、HashMap都可自动扩容,当已使用的空间超过全部空间的一定比例时,就申请扩大一倍的空间来存储,此时会有copy迁移元素到新位置的工作。
     TreeMap,TreeSet,linkedSet,linkedHashMap这些因为不需要事先有个固定的容量,也就不存在所谓扩容问题,都是按需增加。
     Vector、ArrayList都是可以通过下标随机访问,而linked的要通过链表遍历查找来访问。 
0 0