简介
项目需要封装一些东西,在这个封装的过程中,你肯定需要容器的帮助。所以就把容器这个整理了一下。
容器分为Collection和Map,具体都有什么,看下面的图或者看JDK的API文档就好,图中只列了一些相对来说常用的。
现在对上面图中列出的东西进行一个简单的说明:
Collection
Collection定义了存取一组对象的方法,其子接口Set和List分别定义了存储方式。
Set
Set中的数据对象没有顺序且不可以重复。那么它的常用实现又都具有什么特征呢?
HashSet:在底层实现上依赖HashMap,主要依赖了HashMap的Key是不能够重复的来实现不可以重复。
TreeSet:使得存进来的元素是顺序存储的,但元素必须实现Comparator接口。访问和遍历时间很快,操作慢。
LinkedHashSet:对象以顺序存储,先进先出,操作快。
List
List中的数据对象有顺序且可以重复。那么它的常用实现类又都是什么样的呢?
ArrayList:使用一个Object对象数组存储元素,并且具有自变长机制,允许对元素进行快速随机访问。缺点就是每个元素之间不能有间隔,当数组大小不满足需要增加存储能力时,就要将已有的数据复制到新的存储空间。简单一句话,就是访问快,操作慢。
LinkedList:具有链表的优点及缺点:操作快,不支持高效的随机访问。在空间消耗上,不像ArrayList还需要预留一定量的空间。
Vector:也是通过数组实现的,但它支持线程的同步。
Stack:继承自Vector,自己的方法不多,基本跟栈的特点一样。
Map
Map这个容器的用法特别多,个人感觉有时候听到的先存到内存中,就是用Map之类的容器进行存储。
Map的实现和Set、List差不多,也是Hash、Tree、Linked开头的:
HashMap:访问速度很快,查找速度与内容无关,为常量。允话值为空,允许只有一个key为空。
LinkedHashMap:HashMap的子类,但是有了顺序,先入先出。
ConcurrentHashMap:HashMap的线程安全版
TreeMap:看名字可以猜出这个是一个有顺序的Map,它和Linked的区别就是Tree和Link的区别。
ConcurrentSkipListMap:TreeMap的线程安全版
HashTable:和HashMap的区别在于,不允许值为空,不允许key为空,并且是线程同步的。
总结
List肯定有序,其它的凡是带Linked、Tree的都有序,
带Hash的随机访问时间是一个常量,带Link的操作快……
最后选择用哪个,还是和你的需求有关系的:
没有最好的容器,只有最适合你的容器,不然人家也不会提供出这么多的实现。
如果你对内部实现有顺序,可以关联上源码,自己看人家的实现。