List、Map、Set的区别与联系

重复和有序

List 存储的元素是有顺序的,而且值容许重复;
Map 元素按键值对存储,无放入顺序 ,它的键是不容许重复的,可是值是容许重复的;
Set 存储的元素是无顺序的,而且不容许重复,元素虽然无放入顺序,可是元素在 set 中的位置是有该元素的 HashCode 决定的,其位置实际上是固定的。html

同步是线程安全的,非同步是非线程安全的。

同步 synchronized数组

继承关系

List,Set都是继承自Collection接口,Map则不是

List接口有三个实现类:

1.LinkedList

基于链表实现,链表内存是散列的,非线程安全,增删快,查找慢;
优势 LinkedList基于链表的数据结构,地址是任意的,因此在开辟内存空间的时候不须要一个连续的地址,对于新增和删除操做,LinedList比较占优点。
缺点 由于LinkedList要移动指针,因此查询操做性能比较低。安全

2.ArrayList

基于数组实现,非线程安全,效率高,增删慢,查找快;
优势 ArrayList是实现了基于动态数组的数据结构,由于地址连续,一旦数据存储好了,查询操做效率会比较高(在内存里是连着放的)。
缺点 由于地址连续, ArrayList要移动数据,因此插入和删除操做效率比较低。数据结构

3.Vector

基于数组实现,线程安全,效率低,增删慢,查找慢;并发

Map接口有四个实现类:

1.HashMap

基于 hash 表的 Map 接口实现,非线程安全,高效,支持 null 值和 null 键;性能

2. HashTable

实现一个key-value映射的哈希表,线程安全,低效,不支持 null 值和 null 键;
添加数据使用put(key, value),取出数据使用get(key),这两个基本操做的时间开销为常数。
若是相同的对象有不一样的hashCode,对哈希表的操做会出现意想不到的结果(get方法返回null),要避免这种问题,只须要牢记一条:要同时复写equals方法和hashCode方法,而不要只写其中一个。ui

3. LinkedHashMap

是 HashMap 的一个子类,保存了记录的插入顺序;.net

4. SortMap 接口

TreeMap,可以把它保存的记录根据键排序,默认是键值的升序排序。线程

Set接口有两个实现类:

1. HashSet

底层是由 Hash Map 实现,不容许集合中有重复的值,使用该方式时须要重写 equals()和 hash Code()方法;3d

2. LinkedHashSet

继承于 HashSet,同时又基于 LinkedHashMap 来进行实现,底层使用的是 LinkedHashMap。

当须要对数据进行对此访问的状况下选用ArrayList,当须要对数据进行屡次增长删除修改时采用LinkedList。

HashMap 和 ConcurrentHashMap的区别

ConcurrentHashMap 对整个桶数组进行了分段,而 HashMap 则没有
ConcurrentHashMap 在每个分段上都用锁进行保护,从而让锁的粒度更精细一些,并发性能更好,而 HashMap 没有锁机制,不是线程安全的

HashMap 的工做原理

HashMap 基于 hashing 原理,咱们经过 put() 和 get() 方法储存和获取对象。当咱们将键值对传递给 put() 方法时,它调用键对象的 hashCode() 方法来计算 hashcode,让后找到 bucket 位置来储存值对象。当获取对象时,经过键对象的 equals() 方法找到正确的键值对,而后返回值对象。HashMap 使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中。 HashMap 在每一个链表节点中储存键值对对象。

ConcurrentHashMap 的工做原理

ConcurrentHashMap 采用了很是精妙的"分段锁"策略,ConcurrentHashMap 的主干是个 Segment 数组。Segment 继承了 ReentrantLock,因此它就是一种可重入锁(ReentrantLock)。在 ConcurrentHashMap,一个 Segment 就是一个子哈希表,Segment 里维护了一个 HashEntry 数组,并发环境下,对于不一样 Segment 的数据进行操做是不用考虑锁竞争的。

HashMap 和 HashTable 的区别

HashMap 几乎能够等价于 HashTable,除了 HashMap 是非 synchronized 的,并能够接受 null(HashMap 能够接受为 null 的键值 (key) 和值 (value),而 HashTable 则不行)。

HashMap 是非 synchronized,而 HashTable 是 synchronized,这意味着 HashTable 是线程安全的,多个线程能够共享一个 HashTable;而若是没有正确的同步的话,多个线程是不能共享 HashMap 的。Java 5 提供了 ConcurrentHashMap,它是 HashTable 的替代,比 HashTable 的扩展性更好。

另外一个区别是 HashMap 的迭代器 (Iterator) 是 fail-fast 迭代器,而 HashTable 的 enumerator 迭代器不是 fail-fast 的。因此当有其它线程改变了 HashMap 的结构(增长或者移除元素),将会抛出 ConcurrentModificationException,但迭代器自己的 remove() 方法移除元素则不会抛出 ConcurrentModificationException 异常。但这并非一个必定发生的行为,要看 JVM。这条一样也是 Enumeration 和 Iterator 的区别。

因为 HashTable 是线程安全的也是 synchronized,因此在单线程环境下它比 HashMap 要慢。若是你不须要同步,只须要单一线程,那么使用 HashMap 性能要好过 HashTable。

HashMap 不能保证随着时间的推移 Map 中的元素次序是不变的。

线程安全

LinkedList、ArrayList、HashSet是非线程安全的,Vector是线程安全的;

HashMap是非线程安全的,HashTable是线程安全的;

StringBuilder是非线程安全的,StringBuffer是线程安全的。

摘自 https://blog.csdn.net/abbuggy/article/details/7720666
摘自 http://www.javashuo.com/article/p-bczwepme-mt.html
摘自 http://www.javashuo.com/article/p-qxaiygei-dw.html
摘自 http://www.funtl.com/zh/interview/Java-%E9%9D%A2%E8%AF%95%E5%AE%9D%E5%85%B8-List-%E5%92%8C-Set-%E5%8C%BA%E5%88%AB.html

相关文章
相关标签/搜索