Set,List, Map各自实现类的比较

来源:互联网 发布:环信 服务端开发 java 编辑:程序博客网 时间:2024/05/17 02:41

接口

实现类

实现方式

特点

Set

HashSet

链表的数组(哈希表)

1、HashSet类按照哈希算法来存取集合中的对象,存取速度比较快

2、存入HashSet的对象必须定义hashCode()。

3、HashSet通常优于HashTree(插入、查找)。只有当需要产生一个经过排序的序列,才用TreeSet。HashTree存在的唯一理由:能够维护其内元素的排序状态。

LinkedHashSet

链表,哈希表

1、具有HashSet的查询速度,且内部使用链表维护元素的顺序(插入的次序)。于是在使用迭代器遍历Set时,结果会按元素插入的次序显示。

TreeSet

二叉树

1、TreeSet类实现了SortedSet接口,能够对集合中的对象进行排序。

2、使用它可以从Set中提取有序的序列

List

ArrayList

数组

1、允许对元素进行快速随机访问,但是向List中间插入与移除元素的速度很慢。

2、ListIterator只应该用来由后向前遍历 ArrayList,而不是用来插入和移除元素。因为那比LinkedList开销要大很多。

3、每个ArrayList实例都有一个容量(Capacity),即用于存储元素的数组的大小。这个容量可随着不断添加新元素而自动增加,但是增长算法并 没有定义。当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。 

LinkedList

链表

在实现中采用链表数据结构。插入和删除速度快,访问速度慢。

Vector

数组

Vector非常类似ArrayList,但是Vector是同步的。由Vector创建的Iterator,虽然和ArrayList创建的 Iterator是同一接口,但是,因为Vector是同步的,当一个Iterator被创建而且正在被使用,另一个线程改变了Vector的状态(例如,添加或删除了一些元素),这时调用Iterator的方法时将抛出ConcurrentModificationException,因此必须捕获该异常。

Map

HashMap

散列表

Map基于散列表的实现。插入和查询“键值对”的开销是固定的。可以通过构造器设置容量capacity和负载因子load factor,以调整容器的性能。

HashTable

"拉链法"实现哈希表

1、Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。

2、最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。

2、Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。

3、只有HashMap可以让你将空值作为一个表的条目的key或value

LinkedHashMap

链表

类似于HashMap,但是迭代遍历它时,取得“键值对”的顺序是其插入次序,或者是最近最少使用(LRU)的次序。只比HashMap慢一点。而在迭代访问时发而更快,因为它使用链表维护内部次序。

TreeMap

红黑树

1、查看“键”或“键值对”时,它们会被排序(次序由Comparable或Comparator决定)。

2、TreeMap的特点在 于,你得到的结果是经过排序的。TreeMap是唯一的带有subMap()方法的Map,它可以返回一个子树。

WeakHashMap

散列表

弱键(weak key)Map,Map中使用的对象也被允许释放: 这是为解决特殊问题设计的。如果没有map之外的引用指向某个“键”,则此“键”可以被垃圾收集器回收。

IdentifyHashMap

散列表

使用==代替equals()对“键”作比较的hash map。专为解决特殊问题而设计

原创粉丝点击