Java集合类总结

来源:互联网 发布:unity3d htc vive开发 编辑:程序博客网 时间:2024/05/21 12:41

HashMap

HashMap基于哈希表的Map接口的实现,此实现提供所有可选的影射操作,并允许使用null键和null值,此类不保证影射的顺序,特别是不保证该顺序恒久不变。

此实现假定哈希函数将元素适当地分布在各个桶(数组元素)之间,可为基本操作(get和put)提供稳定的性能。迭代collection试图所需的时间与HashMap实例的“容量”(桶的数量)及其大小成比例,如果迭代性能很重要,则不要将初始容量设置的太高(或将负载因子设置的太低)。

HashMap的实例有两个参数影响其性能:初始容量(16)和负载因子。容量是哈希表中桶的数量,初始容量只是哈希表在创建时的容量,加载因子是哈希表在其容量自动增加之前可以达到多满的一种尺度,当哈希表中的条目树超出了加载因子与当前容量的乘积时,则要对该哈希表进行rehash操作(即重建内部数据结构),从而哈希表将具有大约两倍的桶数。

通常,默认加载因子(0.75)在时间和空间成本上寻求一种折中,加载因子过高虽然减少了空间开销,但同时增加了查询成本(在大多数HashMap类的操作中,包括get和put操作,都反应了这一点),在设置初始容量时应该考虑到影射中所需的条目树及其加载因子,以便最大限度地减少rehash操作次数,


LinkedHashMap

LinkedHashMap是HashMapd的一个子类,保存了记录的插入顺序,在用Iterator变了LinkedHashMap时,先得到的记录肯定是先插入的,在遍历时会比HashMap慢,


TreeMap

TreeMap是一个有序的key-value集合,通过红黑树实现,该影射根据其键的自然顺序进行排序,活着根据其创建影射时提供的Comparator进行排序。

TreeMap的基本操作containsKey、get、put和remove的时间复杂度是log(n)。

线程非安全。



ConcurrentHashMap和CopyOnWriteArrayList

       同步的集合类(hashtable和Vector),同步的封装类(使用Collections.synchronizedMap()方法和Collections.synchronizedList()方法返回的对象)可以创建出鲜橙安全的Map和List。但是有些因素使得他们不适合高并发的系统。它们仅有单个锁,对整个集合加锁,以及为了防止ConcurrentModificationException异常经常要在迭代的时候要将集合锁定一段时间,这些特性对可扩展性来说都是障碍。


ConcurrentHashMap和Hashtable的区别

       ConcurrentHashMap和Hashtable都可以用于多线程环境,但是当Hashtable的大小增加到一定的时候,性能会急剧下降,因为迭代时需要被锁定很长时间,因为ConcurrentHashMao引入了分割(segmentation),不论变得多么大,仅仅需要锁定map的某个部分,而其他的线程不需要等到迭代完成才能访问map,简而言之,在迭代的过程中,ConcurrentHashMap仅仅锁定map的某个部分,而Hashtable则会锁定整个map。



ArrayList和LinkedList比较

ArrayList实现了基于动态数组的数据结构实现,LinkedList基于链表的数据结构实现。

对于随机访问get操作,ArrayList优于LinkedList,因为LinkedList要移动指针。

对于新增和删除操作add和remove,LinkedList优于ArrayList,因为ArrayList要移动数据。