服务热线

029-87595239

当前位置:首页 > 社区新闻 > 技术文章 >

Hashmap的实现原理

从J2SE学习hashmap,进一步学习它的实验原理,西安Java培训总结了相关的知识,整理了如下的几种原理。

HashMap数据结构

HashMap的数据结构是经过数组加链表实现的。数组是HashMap的主体,链表是为了处理Hash磕碰问题。

HashMapPut办法

1、在put的时分首要判别key值是不是null,如果是null,则处理null值为key所放的方位

2如果key值不为null,则对key值进行hash运算,如果得到的值在数组的方位没有其他的Entry,则将该值放到数组的相应的方位

3如果hash之后,在数组的方位已经有值了,阐明发生了磕碰,会跟该方位的一切Entrykey值进行比较

4 如果比较的key值相同,则阐明是同一个元素,则会用新的value值替换旧的value值,然后回来旧的value

5如果key值不相同,则阐明不是同一个元素,则将该元素放在链表的第一个方位。

HashMapGet办法

1 get的时分首要判别key值是不是null,如果是null,则取keynull的值所在方位的值。

2如果key不为null,首要核算出keyhashCode,然后在数组中的对应方位取值。

3、跟数组相应方位的key进行hashCodeequals比较,如果持平,则取出该Entry的值。

HashMapresize

         HashMap中的元素越来越多的时分,hash冲突的几率也就越来越高,由于数组的长度是固定的。所以为了进步查询功率,就要对HashMap的数组进行扩容,HashMap的扩容会对原数组中的数据从头核算其在数组中的方位,并放进去。所以这个操作很耗功能。

         那么HashMap什么时分扩容呢?当HashMap中元素的个数超越数组巨细*loadFactor时,就会进行数组扩容。loadFactor的默认值是0.75。当到达这个条件的时分,就会对数组的巨细进行扩容,扩展一倍。然后从头核算每个元素在数组中的方位。所以如果我们可以预知HashMap中元素的个数,那么预设元素的个数可以有用的进步HashMap的功能。

HashMapFail-Fast机制

         HashMap是线程不安全的,所以如果在迭代器迭代的进程中有其他线程修正了map,那么将抛出ConcurrentModificationException,这就是fail-fast机制。

         HashMap中有一个modCount域,记录了HashMap的修正次数,每次对HashMap的内容修正都会添加这个值。在迭代器初始化的进程中,迭代器会记录这个值。

         在迭代器的迭代进程中,每次取数据之前,都会比照modCount的值和自己保存的值是否持平,如果不持平,阐明HashMap被修正了,则抛出反常。