Java基础(二十四) Map源码分析

推荐阅读:

Java提高篇(二三)—–HashMap

Java提高篇(二五)—–HashTable

Java提高篇(二七)—–TreeMap

1、HashMap

HashMap也是我们使用非常多的Collection,它是基于哈希表的 Map 接口的实现,以key-value的形式存在。在HashMap中,key-value总是会当做一个整体来处理,系统会根据hash算法来来计算key-value的存储位置,我们总是可以通过key快速地存、取value。

 public class HashMap<K,V>    extends AbstractMap<K,V>    implements Map<K,V>, Cloneable, Serializable

HashMap实现了Map接口,继承AbstractMap。其中Map接口定义了键映射到值的规则,而AbstractMap类提供 Map 接口的骨干实现,以最大限度地减少实现此接口所需的工作,其实AbstractMap类已经实现了Map,

HashMap底层实现还是数组,只是数组的每一项都是一条链(实现HashMap例子

当HashMap遇到为null的key时,它会调用putForNullKey方法来进行处理。对于value没有进行任何处理,只要是对象都可以。

if (key == null)
            return putForNullKey(value);

2、HashTable 

 public class Hashtable<K,V>    extends Dictionary<K,V>    implements Map<K,V>, Cloneable, java.io.Serializable

Hashtable实现了Map接口,并继承Dictionary抽象类 (已过时,新的实现应该实现 Map 接口而不是扩展此类)。

当HashTable遇到null时,他会直接抛出NullPointerException异常信息。

 if (value == null) {
            throw new NullPointerException();
        }

3、Map同步

Hashtable的方法是同步的,而HashMap的方法不是。所以有人一般都建议如果是涉及到多线程同步时采用HashTable,没有涉及就采用HashMap。这里推荐两个SynchronizedMap 和ConcurrentHashMap 

SynchronizedMap:SynchronizedMap的实现方式是加了个对象锁,每次对HashMap的操作都要先获取这个mutex的对象锁才能进入,所以性能也不会比HashTable好到哪里去,也不建议使用。

Map map= Collections.synchronizedMap(new HashMap<String, String>());

ConcurrentHashMap:在jdk8之前是使用分段加锁的一个方式,分成16个桶,每次只加锁其中一个桶,而在jdk8又加入了红黑树和CAS算法来实现。虽然实现起来很复杂,但使用起来也是非常简单的,最重要的是性能要比上面两种同步方式要快太多。

Map map=new ConcurrentHashMap<>();

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值