Java集合类的总结

依照实现接口分类:

实现Map接口的有:EnumMap、IdentityHashMap、HashMap、LinkedHashMap、WeakHashMap、TreeMap

实现List接口的有:ArrayList、LinkedList

实现Set接口的有:HashSet、LinkedHashSet、TreeSet

实现Queue接口的有:PriorityQueue、LinkedList、ArrayQueue

Set:

HashSet是使用哈希表(hash table)实现的,其中的元素是无序的。HashSet的addremovecontains方法 的时间复杂度为常量O(1)。

TreeSet使用树形结构(算法书中的红黑树red-black tree)实现的。TreeSet中的元素是可排序的,但addremovecontains方法的时间复杂度为O(log(n))。TreeSet还提供了first()、last()、headSet()、tailSet()等方法来操作排序后的集合。

LinkedHashSet介于HashSet和TreeSet之间。它基于一个由链表实现的哈希表,保留了元素插入顺序。LinkedHashSet中基本方法的时间复杂度为O(1)。

List和Set的区别 
1. Set 接口实例存储的是无序的,不重复的数据。List 接口实例存储的是有序的,可以重复的元素。 
2. Set检索效率低下,删除和插入效率高,插入和删除不会引起元素位置改变 ,实现类有HashSet,TreeSet。 
3. List和数组类似,可以动态增长,根据实际存储的数据的长度自动增长List的长度。查找元素效率高,插入删除效率低,因为会引起其他元素位置改变 ,实现类有ArrayList,LinkedList,Vector,CopyOnWriteArrayList。
 

ArrayList与Vector的区别

两者都是基于索引,内部结构是数组
元素存取有序并都允许为null
都支持fail-fast机制
Vector是同步的,不会过载,而ArrayList不是,但ArrayList效率比Vector高,如果在迭代中对集合做修改可以使用CopyOnWriteArrayList
初始容量都为10,但ArrayList默认增长为原来的50%,而Vector默认增长为原来的一倍,并且可以设置
ArrayList更通用,可以使用Collections工具类获取同步列表和只读列表
适用场景分析: 
1、Vector是线程同步的,所以它也是线程安全的,而ArrayList是线程异步的,是不安全的。如果不考虑到线程的安全因素,一般用ArrayList效率比较高。 
2、如果集合中的元素的数目大于目前集合数组的长度时,在集合中使用数据量比较大的数据,用Vector有一定的优势
 

ArrayList与LinkedList的区别

两者都是List接口的实现类
ArrayList是基于动态数组的数据结构,而LinkedList是基于链表的数据结构
对于随机访问get和set(查询操作),ArrayList要优于LinkedList,因为LinkedList要移动指针
对于增删操作(add和remove),LinkedList优于ArrayList
适用场景分析: 
当需要对数据进行对此访问的情况下选用ArrayList,当需要对数据进行多次增加删除修改时采用LinkedList

HashMap和HashTable的区别 
1. 都是基于hash表实现的,每个元素都是key-value对,内部都是通过单向链表解决冲突,容量都会自动增长 
HashMap默认容量为16,每次扩容变为原来的2倍,HashTable初始容量为11,每次扩容变为原来的2倍加1 
2. HashMap继承自AbstractMap类,HashTable继承自Dictionary类, 
3. HashTable是同步的,适合多线程环境,而HashMap不是,但效率相对较高 
4. HashMap允许key和value为null,而HashTable不允许 
5. Hash值的使用不同,HashTable直接使用对象的hashcode值,而HashMap重新计算hash值 
6. 在Java1.4中引入了HashMap的子类LinkedHashMap,若需要遍历顺序,可以从HashMap转向LinkedHashMap, 而HashTable的顺序是不可预知的 
7. HashMap提供对key的Set进行遍历,因此它支持fail-fast机制,而HashTable提供对key的Enumeration进行遍历,不支持fail-fast 
8. HashTable被认为是个遗留的类,如果在迭代的时候修改Map,可以使用ConcurrentHashMap(Java5出现) 
9. HashTable产生于JDK1.1,而HashMap产生于JDK1.2
 

HashSet与TreeSet

HashSet不能保证元素的排列顺序,TreeSet是SortedSet接口的唯一实现类,可以确保集合元素处于排序状态
HashSet底层用的是哈希表,TreeSet采用的数据结构是红黑树
HashSet中元素可以是null,但只能有一个,TreeSet不允许放入null
适用场景分析: 
HashSet是基于Hash算法实现的,其性能通常都优于TreeSet。我们通常都应该使用HashSet,在我们需要排序的功能时,我们才使用TreeSet。

HashMap和ConcurrentHashMap的区别 
1、HashMap不是线程安全的,而ConcurrentHashMap是线程安全的。 
2、ConcurrentHashMap采用锁分段技术,将整个Hash桶进行了分段segment,也就是将这个大的数组分成了几个小的片段segment,而且每个小的片段segment上面都有锁存在,那么在插入元素的时候就需要先找到应该插入到哪一个片段segment,然后再在这个片段上面进行插入,而且这里还需要获取segment锁。 
3、ConcurrentHashMap让锁的粒度更精细一些,并发性能更好。
 

猜你喜欢

转载自blog.csdn.net/qq_26857649/article/details/84240503