一、Map概述

  Map:“键值”对映射的抽象接口。该映射不包括重复的键,一个键对应一个值。

1.1、HashTable【不常用】

  基于“拉链法”实现的散列表。

  底层数组+链表实现,无论key还是value都不能为null,线程安全,实现线程安全的方式是在修改数据时锁住整个HashTable,效率低,ConcurrentHashMap做了相关优化  

  初始size为11,扩容:newsize = olesize*2+1

  计算index的方法:index = (hash & 0x7FFFFFFF) % tab.length

1.2、HashMap和ConcurrentHashMap【推荐常用】

  参看:020-并发编程-java.util.concurrent之-jdk6/7/8中ConcurrentHashMap、HashMap分析

1.3、HashMap和HashTable有什么区别

  1、HashMap是非线程安全的,HashTable是线程安全的。

  2、HashMap的键和值都允许有null值存在,而HashTable则不行。

  3、因为线程安全的问题,HashMap效率比HashTable的要高。

1.4、HashTable、Collections.synchronizedMap()、 ConcurrentHashMap线程同步上有什么区别,如何线程安全的使用 HashMap

  Hashtable源码中是使用 synchronized 来保证线程安全的  

  Collections.synchronizedMap()

    源码,synchronizedMap()的实现

// synchronizedMap方法
public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m) {
return new SynchronizedMap<>(m);
}
// SynchronizedMap类
private static class SynchronizedMap<K,V>
implements Map<K,V>, Serializable {
private static final long serialVersionUID = 1978198479659022715L; private final Map<K,V> m; // Backing Map
final Object mutex; // Object on which to synchronize SynchronizedMap(Map<K,V> m) {
this.m = Objects.requireNonNull(m);
mutex = this;
} SynchronizedMap(Map<K,V> m, Object mutex) {
this.m = m;
this.mutex = mutex;
} public int size() {
synchronized (mutex) {return m.size();}
}
public boolean isEmpty() {
synchronized (mutex) {return m.isEmpty();}
}
public boolean containsKey(Object key) {
synchronized (mutex) {return m.containsKey(key);}
}
public boolean containsValue(Object value) {
synchronized (mutex) {return m.containsValue(value);}
}
public V get(Object key) {
synchronized (mutex) {return m.get(key);}
} public V put(K key, V value) {
synchronized (mutex) {return m.put(key, value);}
}
public V remove(Object key) {
synchronized (mutex) {return m.remove(key);}
}
// 省略其他方法
}

  从源码中可以看出调用 synchronizedMap() 方法后会返回一个 SynchronizedMap 类的对象,而在 SynchronizedMap 类中使用了 synchronized 同步关键字来保证对 Map 的操作是线程安全的。

  ConcurrentHashMap 在JDK7 是一个 Segment 数组,Segment 通过继承 ReentrantLock 来进行加锁,所以每次需要加锁的操作锁住的是一个 segment,这样只要保证每个 Segment 是线程安全的,也就实现了全局的线程安全。

  ConcurrentHashMap 在JDK8 CHM 摒弃了 Segment(锁段)的概念,而是启用了一种全新的方式实现,利用CAS算法。

  ConcurrentHashMap性能是明显优于Hashtable和SynchronizedMap

1.5、TreeMap

  支持对键有序地遍历,使用时建议先用HashMap增加和删除成员,最后从HashMap生成TreeMap;附加实现了SortedMap接口,支持子Map等要求顺序的操作

        Map hashMap = new HashMap<String, String>();
TreeMap<String, String> treeMap = new TreeMap<String, String>(hashMap);

1.6、LinkedHashMap

  简图

    

  跟HashMap一样,它也是提供了key-value的存储方式,并提供了put和get方法来进行数据存取。

  LinkedHashMap继承了HashMap,所以它们有很多相似的地方。

  把accessOrder设置为false,这就跟存储的顺序有关了,LinkedHashMap存储数据是有序的,而且分为两种:插入顺序和访问顺序。

1.6.1、HashMap与LinkedHashMap的结构对比

  LinkedHashMap其实就是可以看成HashMap的基础上,多了一个双向链表来维持顺序。

          

1.6.2、小结

  LinkedHashMap是继承于HashMap,是基于HashMap和双向链表来实现的。

  HashMap无序;LinkedHashMap有序,可分为插入顺序和访问顺序两种。如果是访问顺序,那put和get操作已存在的Entry时,都会把Entry移动到双向链表的表尾(其实是先删除再插入)。

  LinkedHashMap存取数据,还是跟HashMap一样使用的Entry[]的方式,双向链表只是为了保证顺序。

  LinkedHashMap是线程不安全的。

二、Set

  Set与List的区别在于,Set中存储的元素是经过了去重的(即如果a.equals(b),则Set中只可能存在一个)。

  Set的典型实现是HashSet,其主要方法add,remove,contains,均是通过内置的HashMap来进行实现的。

  比如add方法,本质上是调用了HashMap的put方法,以传入的object为Key,并以dummy value(private static final Object PRESENT = new Object();)为Value。

  remove方法,也是在内部调用了HashMap的remove方法,将传入的object作为key,从而对HashSet中保存的object进行删除


003-jdk-数据结构-HashMap、HashTable、ConcurrentHashMap、TreeMap、LinkedHashMap、Set的更多相关文章

  1. [Java集合] 彻底搞懂HashMap,HashTable,ConcurrentHashMap之关联.

    注: 今天看到的一篇讲hashMap,hashTable,concurrentHashMap很透彻的一篇文章, 感谢原作者的分享. 原文地址: http://blog.csdn.net/zhanger ...

  2. 彻底搞懂HashMap,HashTable,ConcurrentHashMap之关联.

    注: 今天看到的一篇讲hashMap,hashTable,concurrentHashMap很透彻的一篇文章, 感谢原作者的分享.  原文地址: http://blog.csdn.net/zhange ...

  3. HashMap,HashTable,concurrentHashMap,LinkedHashMap 区别

    HashMap 不是线程安全的 HashTable,concurrentHashMap 是线程安全 HashTable 底层是所有方法都加有锁(synchronized) 所以操作起来效率会低 con ...

  4. hashmap,hashTable concurrentHashMap 是否为线程安全,区别,如何实现的

    线程安全类 在集合框架中,有些类是线程安全的,这些都是jdk1.1中的出现的.在jdk1.2之后,就出现许许多多非线程安全的类. 下面是这些线程安全的同步的类: vector:就比arraylist多 ...

  5. Java集合——HashMap,HashTable,ConcurrentHashMap区别

    Map:“键值”对映射的抽象接口.该映射不包括重复的键,一个键对应一个值. SortedMap:有序的键值对接口,继承Map接口. NavigableMap:继承SortedMap,具有了针对给定搜索 ...

  6. HashMap HashTable ConcurrentHashMap

    1. Hashtable 和 HashMap (1)区别,这两个类主要有以下几方面的不同:Hashtable和HashMap都实现了Map接口,但是Hashtable的实现是基于Dictionary抽 ...

  7. HashMap/Hashtable/ConcurrentHashMap区别

    HashMap:每个隔间都没锁门,有人想上厕所,管理员指给他一个隔间,里面没人的话正常用,里面有人的话把这个人赶出来然后用. 优点,每个人进来不耽误都能用:缺点,每一个上厕所的人都有被中途赶出来的危险 ...

  8. HashMap,HashTable,TreeMap区别和用法

    开始学HashTable,HashMap和TreeMap的时候比较晕,觉得作用差不多,但是到实际运用的时候又发现有许多差别的.需要大家注意,在实际开发中以需求而定. java为数据结构中的映射定义了一 ...

  9. HhashMap HashTable ConcurrentHashMap

    hashMap hashTable concurrentHashMap hashMap的效率高于hashTable,hashMap是线程不安全的,并发时hashMap put方法容易引起死循环,导致c ...

  10. 牛客网Java刷题知识点之Map的两种取值方式keySet和entrySet、HashMap 、Hashtable、TreeMap、LinkedHashMap、ConcurrentHashMap 、WeakHashMap

    不多说,直接上干货! 这篇我是从整体出发去写的. 牛客网Java刷题知识点之Java 集合框架的构成.集合框架中的迭代器Iterator.集合框架中的集合接口Collection(List和Set). ...

随机推荐

  1. 开启 clr enabled

    '; GO RECONFIGURE; GO '; GO RECONFIGURE; '; GO

  2. Paper Reading:ION

    Inside-Outside Net (ION) 论文:Inside-Outside Net: Detecting Objects in Context with Skip Pooling and R ...

  3. Java基础-异常处理机制 及异常处理的五个关键字:try/catch/finally/throw /throws

    笔记: /** 异常处理机制: 抓抛模型 * 1."抛", 一旦抛出,程序终止! printStackTrace()显示异常路径! * 2."抓", 抓住异常 ...

  4. python中的几种数据类型(一)

    一.整型(数字)      python2中有长整形long      python3 中全都是整型 int n = 56 print(n.bit_length()) # 0011 1000 # 12 ...

  5. Spring Aop实例@Aspect、@Before、@AfterReturning@Around 注解方式配置(转)

    用过spring框架进行开发的人,多多少少会使用过它的AOP功能,都知道有@Before.@Around和@After等advice.最近,为了实现项目中的输出日志和权限控制这两个需求,我也使用到了A ...

  6. Js实现table单双行交替色

    依稀记得,当初我刚学编程的时候还学过怎么实现表格单双行交替色,现如今早已记不清当时的实现思路,这两天突然想起,没事就自己写了一小段代码,也不知道是否是当年的思路,不过不用纠结这个问题.:) 代码很简单 ...

  7. 15-Node.js学习笔记-Express的安装及检验

    最新的node已经把一些命令工具单独的分出来了,所以我们应该先下安装他的打包函数,再安装express,在进行检验就安装成功了 如需require还需在文件夹内单独安装 sudo npm instal ...

  8. js特殊字符的验证

    // 特殊字符的验证 // 包含特殊字符返回true,不包含特殊字符返回false function checkEspcial(s) { var str=trim(s); //var reg=/< ...

  9. JAVA中的getBytes()方法

    在Java中,String的getBytes()方法是得到一个操作系统默认的编码格式的字节数组.这个表示在不同情况下,返回的东西不一样! String.getBytes(String decode)方 ...

  10. java http 上传文件夹

    用JAVA实现大文件上传及显示进度信息 ---解析HTTP MultiPart协议 (本文提供全部源码下载,请访问 https://github.com/1269085759/up6-jsp-mysq ...