收藏!想学Hashmap,这份攻略很详细,面试干货!

Hashmap

三、HashTable, HashMap,TreeMap区别?
1、HashTable线程同步,HashMap非线程同步。
2、HashTable不允许<键,值>有空值,HashMap允许<键,值>有空值。
3、HashTable使用Enumeration,HashMap使用Iterator。
4、HashTable中hash数组的默认大小是11,增加方式的old*2+1,HashMap中hash数组的默认大小是16,增长方式一定是2的指数倍。
5、TreeMap能够把它保存的记录根据键排序,默认是按升序排序。

四、HashSet,TreeSet,LinkedHashSet的区别?
(1)hashset 根据算法来验证元素是否重复,县调用hashcode再调用equles()为了使hashset实现 需要重写Hashcode()和equles()方法
(2)treeset:自动排序 先比较再排序 升序输出 让类实现compareable接口 实现compareTo()方法
(3)HashSet:使用功能速度都很快但是没有顺序,TreeSet:使用查询根据条件升序
(4)LinkedHa,hSet:添加按照顺序保存对象HashSet是无序的TreeSet是有序的

hashMap的设计原理,底层结构是(链表+数组)扩容方式中(HashMap中hash数组的默认大小是16,增长方式一定是2的指数倍),简单地说,HashMap就是将key做hash算法,然后将hash值映射到内存地址,取得key所对应的数据。。这种设计好在哪里(比如讲一讲put是如何做hash的)
put的过于频繁,会造成不同的key-value计算出了同一个hash,这个时候hash冲突了

hash算法的高效性
HashMap中用于计算key的hash值。它前后分别调用了Object类的hashCode()方法和HashMap的内部函数hash()。Object类的hashCode()方法默认是native的实现,可以认为不存在性能问题。而hash()函数的实现全部基于位运算,因此,也是高效的

这种hash可能会有冲突,hashMap也是做了相应设计的。

然后面试官会问题你怎么解决冲突?你可以再给他讲讲解决hash冲突的三种通常方式
HashMap的数据结构是一个列表数组,一个数组索引空间内,存放多个值项
,而hashMap用的是链式法,这样会有隐患就是hash链过长。

面试官再问,你会给他讲解决复杂度高的长链用了红黑树的结构,这里还可以延伸到红黑树的特点
(1)每个节点或者是黑色,或者是红色。

(2)根节点是黑色。

(3)每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!]

(4)如果一个节点是红色的,则它的子节点必须是黑色的。

(5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点

或者jdk7和jdk8的不同实现,
JDK7中HashMap采用的是位桶+链表的方式,即我们常说的散列链表的方式,而JDK8中采用的是位桶+链表/红黑树 采用尾插法,防止产生环形链表
在并发时候 头插会把下一次的链表head当做尾节点

为啥尾插可以防止环形
主要是并发操作的时候,当插入元素时触发了扩容的时候,会把元素移入新的hashmap,重新计算hash值并放入桶的时候,重新计算hash值并放入桶的时候

这时候你可以说解决hash冲突,但hashMap还会有并发和同步的问题。
面试官会让你再讲讲,你可以说说hashtable是线程安全的,怎么实现的(sync函数),并不好,从而引出更好的juc包,说说concurrentHashMap,之后又可以说道锁分段原理,弱一致性迭代器,concurrentHashMap的锁粒度(java7和java8不同),同包的CopyOnWriteArray等等。

你还可以延伸说到锁(重量、轻量、悲观乐观各自实现、底层源码等等)、缓存(因为很多时候Map的结构可以作为缓存,从而可以说到缓存系统的设计,kv原理,分布式缓存redis、memcashed等等)

举这个例子就是想说,一个简单的基础问题可以一步一步有条理有层次的回答,每一层表达完抛个引子,让面试官可以继续问下去,从而让面试官真正了解你的掌握的深度。

hashMap是线程不安全的,HashMap是数组+链表+红黑树(JDK1.8增加了红黑树部分)实现的,采用哈希表来存储的

说说jdk8做了哪些改变

1.8 hashmap,当超过8时,变为红黑树,采用尾插法,防止产生环形链表
在并发时候 头插会把下一次的链表head当做尾节点

为啥尾插可以防止环形
主要是并发操作的时候,当插入元素时触发了扩容的时候,会把元素移入新的hashmap,重新计算hash值并放入桶的时候,重新计算hash值并放入桶的时候
(1)数组
(2)单项链表1.7前
(3)红黑树1.8后

bucketed(桶)
初始容量 1<<4 //aka16

基于hashing法原理使用(key-value)存储到hashmap中获取对象,用put()方法传递值和键 调用hashcode()方法return hashCode
用于找到bucketed

1.判断键值对对数组table[i]是否为null 否则执行resize()进行扩容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值