一.List总结概述
List继承了Collection,是有序的列表。
实现类有ArrayList、LinkedList、Vector、Stack等
ArrayList是基于数组实现的,是一个数组队列。可以动态的增加容量!
LinkedList是基于链表实现的,是一个双向循环列表。可以被当做堆栈使用!
Vector是基于数组实现的,是一个矢量队列,是线程安全的!
Stack是基于数组实现的,是栈,它继承与Vector,特性是FILO(先进后出)!
二.List使用场景
在实际的应用中如果使用到队列,栈,链表,首先可以想到使用List。不同的场景下面使用不同的工具,效率才能更高!
1.当集合中对插入元素数据的速度要求不高,但是要求快速访问元素数据,则使用ArrayList!
2. 当集合中对访问元素数据速度不做要求不高,但是对插入和删除元素数据速度要求高的情况,则使用LinkedList!
3.当集合中有多线程对集合元素进行操作时候,则使用Vector!但是现在BVector现在一般不再使用,如需在多线程下使用,可以用CopyOnWriteArrayList,在java.util.concurrent包下。
4.当集合中有需求是希望后保存的数据先读取出来,则使用Stack!
三、Set使用场景
1.HashSet是一个无序的集合,基于HashMap实现;TreeSet是一个有序的集合,基于TreeMap实现。
2.HashSet集合中允许有null元素,TreeSet集合中不允许有null元素。
3.HashSet和TreeSet都是非同步!在使用Iterator进行迭代的时候要注意fail-fast。
4.HashSet的性能总是比TreeSet好(特别是最常用的添加、查询元素等操作),因为TreeSet需要额外的红黑树算法来维护集合元素的次序。只有当需要一个保持排序的Set时,才应该使用TreeSet,否则都应该使用HashSet
5.对于普通的插入、删除操作,LinkedHashSet比HashSet要略慢一点,这是由维护链表所带来的开销造成的。不过,因为有了链表的存在,遍历LinkedHashSet会更快
四、Map使用场景
1.HashMap和Hashtable的效率大致相同,因为它们的实现机制几乎完全一样。但HashMap通常比Hashtable要快一点,因为Hashtable需要额外的线程同步控制
2.TreeMap通常比HashMap、Hashtable要慢(尤其是在插入、删除key-value对时更慢),因为TreeMap底层采用红黑树来管理key-value对
3.使用TreeMap的一个好处就是: TreeMap中的key-value对总是处于有序状态,无须专门进行排序操作
List和Set的区别
- Set 接口实例存储的是无序的,不重复的数据。List 接口实例存储的是有序的,可以重复的元素。
- Set检索效率低下,删除和插入效率高,插入和删除不会引起元素位置改变 ,实现类有HashSet,TreeSet。
- List和数组类似,可以动态增长,根据实际存储的数据的长度自动增长List的长度。查找元素效率高,插入删除效率低,因为会引起其他元素位置改变 ,实现类有ArrayList,LinkedList,Vector,CopyOnWriteArrayList。
HashMap和HashTable的区
-
都是基于hash表实现的,每个元素都是key-value对,内部都是通过单向链表解决冲突,容量都会自动增长
-
HashMap默认容量为16,每次扩容变为原来的2倍,HashTable初始容量为11,每次扩容变为原来的2倍加1
-
HashMap继承自AbstractMap类,HashTable继承自Dictionary类,
-
HashTable是同步的,适合多线程环境,而HashMap不是,但效率相对较高
-
HashMap允许key和value为null,而HashTable不允许
-
Hash值的使用不同,HashTable直接使用对象的hashcode值,而HashMap重新计算hash值
-
在Java1.4中引入了HashMap的子类LinkedHashMap,若需要遍历顺序,可以从HashMap转向LinkedHashMap, 而HashTable的顺序是不可预知的
-
HashMap提供对key的Set进行遍历,因此它支持fail-fast机制,而HashTable提供对key的Enumeration进行遍历,不支持fail-fast
-
HashTable被认为是个遗留的类,如果在迭代的时候修改Map,可以使用ConcurrentHashMap(Java5出现)
-
HashTable产生于JDK1.1,而HashMap产生于JDK1.2