请选择 进入手机版 | 继续访问电脑版
搜索
房产
装修
汽车
婚嫁
健康
理财
旅游
美食
跳蚤
二手房
租房
招聘
二手车
教育
茶座
我要买房
买东西
装修家居
交友
职场
生活
网购
亲子
情感
龙城车友
找美食
谈婚论嫁
美女
兴趣
八卦
宠物
手机

极品宝宝无敌妻 十个问题带你了解和掌握Java HashMap 霹雳双星

[复制链接]
查看: 710|回复: 0

209

主题

446

帖子

861

积分

等待验证会员

积分
861
发表于 2019-4-13 17:45 | 显示全部楼层 |阅读模式
<h1>做一个积极的人

<h1>编码、改bug、提升自己

<h1>我有一个乐园,面向编程,春暖花开!

接待关注我的公众号:Java编程技术乐园,一路在乐园中长大!
<h1>十个题目带你领会和把握java HashMap

一、前言
本篇内容是源于 “ 由阿里巴巴Java开辟规约HashMap条目激发的故事”,并在此根本上加了自己的对HashMap更多的思考熟悉和整理。而且作为一位java开辟工程师,应当是方法会和把握的这些常识!

  • 在《阿里巴巴java开辟规约中》提到:
【保举】调集初始化时,指定调集初始值巨细。 说明:HashMap利用以下机关方式停止初始化,假如临时没法肯定调集巨细,那末指定默许值(16)即可!
在停止本篇的阅读之前,首先请你花三分钟时候,思考面关于HashMap的十个题目,带着题目去阅读内容结果更好! 题目以下:

DXCPICKPRE_0</pre>二:HashMap相关常识的整理和简单先容
HashMap是基于哈希表的Map实现的,一个Key对应一个Value,答应利用null键和null值,不保证映照的顺序,出格是它不保证该顺序长久稳定!是非线程平安的的。
其中 “不保证映照的顺序,出格是它不保证该顺序长久稳定” 若何了解?

DXCPICKPRE_1</pre>1.HashMap 是什么,实现道理?
HashMap是一个存储key和value的调集,一个key对应一个value,实现道理是利用hash算法经过对key停止hash后存储哈希表(也称为哈希数组)中,哈希表(哈希数组)的每个元素都是一个单链表的头节点,链表是用来处理抵触的,假如分歧的key映照到了数组的同一位置处,就将其放入单链表中。
假如容量不敷(跨越了阀值)时,一样会自动增加
看下图(jDK1.7):

十个题目带你领会和把握Java HashMap

十个问题带你了解和掌握Java HashMap  科技资讯 174514b90hx4839e5xix5e


其中哈希表(哈希数组)和 单链表的节点元素
2.HashMap 默许bucket(桶)数组多大?(上面已经给出),最大容量是几多?

DXCPICKPRE_2</pre>总结: 默许值初始值为16,最大值2 的30次方。
3.假如new HashMap<>(19),bucket数组多大?
HashMap 的 bucket 数组巨细一定是2的幂,假如 new 的时辰指定了容量且不是2的幂, 现实容量会是最接近(大于)指定容量的2的幂,比如 new HashMap<>(19),比19大且最接近的2的幂是32,现实容量就是32。

DXCPICKPRE_3</pre>4.HashMap 什么时辰斥地bucket数组占用内存?
HashMap 在 new 后并不会立即分派bucket数组,而是第一次 put 时初始化**利用resize() 函数停止分派。(类似 ArrayList 在第一次 add 时分派空间)
5.HashMap 何时扩容?
数据 put 后,假如数据量跨越threshold( Capacity * LoadFactor ),就要resize!

DXCPICKPRE_4</pre>resize()方式停止扩容,扩容是一个相当耗时的操纵,由于它需要重新计较这些元素在新的数组中的位置并停止复制处置。(具体可以看源码,jdk1.8停止响应的优化) 在用HashMap的时,假如能提早预估下HashMap中元素的个数,这样有助于进步HashMap的性能。
6.为什么String, Interger这样的包装类类合适作为HashMap的key(键)呢?
String, Interger这样的wrapper类作为HashMap的键是再合适不外了,而且String最为常用。由于String是不成变的,也是final的,而且已经重写了equals()和hashCode()方式了。
其他的wrapper类也有这个特点。不成变性是需要的,由于为了要计较hashCode(),就要避免键值改变,假如键值在放入时和获得时返回分歧的hashcode的话,那末就不能从HashMap中找到你想要的工具。不成变性还有其他的优点如线程平安。
假如你可以仅仅经过将某个field声明成final就能保证hashCode是稳定的,那末请这么做吧。由于获得工具的时辰要用到equals()和hashCode()方式,那末键工具正确的重写这两个方式是很是重要的。
假如两个不相称的工具返回分歧的hashcode的话,那末碰撞的几率就会小些,这样就能进步HashMap的性能。
7.假如用自界说工具当做hashmap的key停止存储要留意什么?
这是题目6的延长。假如一个自界说工具做为key,一定要留意工具的不成变性,否则能够致使存入Map中的数据没法取出,形成内存泄露!
(1).要留意这个工具能否为可变工具。
(2).一定要重写hashcode方式和equals方式,由于在HashMap的源代码里面,是先比力HashCode能否相称,同时要满足援用相称大概equals相称。
可参考:危险!在HashMap中将可变工具用作Key
8.当两个工具的hashcode不异会发生什么(若何处理hash抵触)?假如两个键的hashcode不异,你若何获得值工具?
两个工具hashcode不异,它们在的哈希bucket中找到了不异位置,会发生“碰撞”。由于HashMap利用链表存储工具,这个Entry(包括有键值对的Map.Entry工具)会存储在链表中。可以参考题目1中的图!
当我们挪用get()方式,HashMap会利用key的hashcode找到bucket位置,然后发现两个工具存储在一个哈希bucket中,找到bucket位置以后,会挪用key.equals()方式去找到链表中正确的节点,终极找到要找的值工具。
9.HashMap 和 ConcurrentHashMap的区分?
说简单点就是HashMap是线程不服安的,单线程情况下利用;而ConcurrentHashMap是线程平安的,多线程利用!
可以利用 Collections.synchronizedMap(new HashMap());将HashMap封装成线程平安的,其内部实现道理是利用了关键字synchronized。
10.jdk1.7和jdk1.8中HashMap的实现有哪些区分?
jdk1.7和jdk1.8的区分还是很多,下面先容两个! (1):存储结构 如图(jDK1.8)

十个题目带你领会和把握Java HashMap

十个问题带你了解和掌握Java HashMap  科技资讯 174514q4ia8fa4c4y70ifa



DXCPICKPRE_5</pre>在JDK1.7版本中.不管负载因子和Hash算法设想的再公道,也免不了会出现拉链(单链表)太长的情况,一旦出现拉链(单链表)太长,会严重影响HashMap的性能。
在JDK1.8版本中,对数据结构做了进一步的优化,引入了红黑树。而当链表长度太长(默许跨越8)时,链表就转换为红黑树,操纵红黑树快速增删改查的特点进步HashMap的性能,其中会用到红黑树的插入、删除、查找等算法。本文不再对红黑树展开会商, 想领会更多红黑树数据结构的工作道理可以参考 红黑树数据结构的工作道理
总结:
JDK7 中的 HashMap 采用数组+链表的结构来存储数据。
JDK8 中的 HashMap 采用数组+链表或红黑树的结构来存储数据。
(2):一些操纵方式的优化如resize resize()用来第一次初始化,大概 put 以后数据跨越了threshold(Capacity * LoadFactor)后扩容,这里具体不贴代码了,大要说明一下!
jdk1.7 间接扩容两倍,table.length * 2; 源码中利用resize(2 * table.length);
jdk1.8 优化数组下标计较: index = (table.length - 1) & hash ,由于 table.length 也就是capacity 必定是2的N次方,利用 & 位运算意味着只是多了最高位, 这样就不用重新计较 index,元素要末在原位置,要末在原位置+ oldCapacity
假如上面内容那里有题目接待指出!大概你对上面的内容有自己的熟悉和了解也接待批评,希望相互相同,配合长大!感谢!
三:参考的博文
由阿里巴巴Java开辟规约HashMap条目激发的故事 java调集系列——Map之HashMap先容(八) HashMap的工作道理 http://blog.csdn.net/ns_code/article/details/36034955 Java8系列之重新熟悉HashMap
四:更多常识进修
最初在推行一个我整理的java常识点,目录以下!有爱好的可以点击阅读阅读一下! java的线程平安、单例形式、JVM内存结构等常识进修和整理:

十个题目带你领会和把握Java HashMap

十个问题带你了解和掌握Java HashMap  科技资讯 174514nblebwkeirdrqby4


"不管做什么,只要对峙下去就会看到纷歧样!在路上,不骄不躁!"
感谢您的阅读
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2006-2014 快猫网-人工智能和智能硬件领域的互联网科技媒体 版权所有 法律顾问:高律师 客服电话:0791-88289918
技术支持:迪恩网络科技公司  Powered by Discuz! X3.2
快速回复 返回顶部 返回列表