HashMap学习笔记

1.Map的特点:存储的是键值对

2.Map中的键值对可以看成一个Entry
(Map中的键值对在存储底层创建一个Node类的对象,并把键值对的内容放到该对象的属性中,Node实现了Entry接口)

3.Map中的key是无序的不可重复的。向Map中的Key添加的自定义类的对象必须重写hashCode和equals方法
可以把所有的key开成是Set集合

4.Map中的value是无序的可重复的,想Map中的value添加自定义类的对象必须重写equals
可以把所有的value看成是collection的集合

5.Map中的Entry(Node)是无序的不可重复的,Entry在数组的位置是有key决定的.

三 Set的再说明

1.HashSet的底层就是HashMap,向HashSet中添加的数据实际上添加到了HashMap的key中
因为HashMap的key必须重写hashCode和equals方法所以向HashSet中添加的内容必须重写hashCode和equals方法

四:面试题

1.HashMap和Hashtable 的区别?

hashMap 是线程不安全的,Hashtable是线程安全的,hashtable 的key 和value 不能为null
hashMap 的key 和 value 可以为null,hashtable是jdk1.0时出现的类

2.HashMap的底层实现原理?

当我们向集合中添加了k1,v1,时,首先根据k1哈希值决定元素存放的位置,如果该位置上没有元素,则直接存储
如果该位置上已经存在其他元素k2,v2那么调用equals方法让k1和k2进行比较,如果结果为true那么value进行覆盖v2覆盖v1。
如果equals结果为false那么将以链表的形式存放元素,在jdk1.8时,当链表上元素数量达到8时
那么链表会替换成红黑树
在这里插入图片描述3.为什么要扩容2倍…?
16 ,32,64 …
15, 31, 63

像15,31,63这些数值的二进制最后几位全部是1.
如果最后几位全部是1的话那么hash值是多少都能得到015,031,0~63
(数组上的每一个索引位置都可能算到,否则一定有些索引位置将永远无法得到,也就是将永远无法存数据)

	  1111
	  0000
	  -----
	  1111
	  
	  1111
	  0100
	  ----
	  0100
	  
	  1111
	  x
	  ----
	  x
	  
	  如果不是1111存在的问题
	  1011
	  0100
	  ----
	  0000
	  
	  1011
	  0111
	  ----
	  0011   注意 :那么将有一些数值永远无法得到

五 :HashMap的构造器:
new HashMap() : 底层会创建一个长度为16的数组(Node类型),加载因子为0.75,当我们向集合中添加的数据
超过12 (16 * 0.75)时便会扩容,扩容为原来的2倍。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值