浅谈对HashMap的理解

浅谈对HashMap的理解:

1.实现的接口

HashMap同Hashtable,TreeMap都是Map接口的实现类,都是以键值对<key,value>的形式存储和操作数据的容器类型。

2.底层存储结构

HashMap基于哈希表进行存储,在JDK1.7之前由数组+链表组成。JDK1.8以后由数组+链表+红黑树,在解决哈希冲突时有较大的变化,当链表长度大于阈值(默认为8)并且数组长度大于64时,将链表转换成红黑树,以减少搜索时间。

3.存储方式

  • HashMap中的每一个元素(k,v键值对),都会被封装成一个内部类Entry对象。该对象存有key(键)、value(值)、next(下一个元素)、hash(哈希值);
  • 在数组中保存Entry对象;
  • 每次存储元素(Entry对象)时,先使用hash方法计算key的hashcode,再通过(长度-1)&hash得到这个元素在数组中的位置下标,如果数组该位置已经存放有元素(产生哈希冲突),继续判断key的内容是否相等,如果相等,覆盖原value值;如果不相等,判断当前节点类型是否是TreeNode<k,v>树形节点,若是树形节点,创建树形节点插入红黑树;若不是,创建普通Node<k,v>加入链表尾部。判断链表长度大于阈值(默认为8)并且数组长度大于64,如果满足,将链表转换成红黑树;如果不满足,数组扩容。

4.扩容方式:

  • 当HashMap中的元素个数超过数组长度×加载因子时,会进行数组扩容;(数组长度:默认为16,也可通过有参构造方法自定义,一般为2的幂次方,若不是,HashMap也会转换成2的幂次方,作为数组的初始化长度;加载因子:默认为0.75,也可以在调用HashMap有参构造方法时在参数2的位置上自定义,建议不要超过0.75)
  • 链表长度大于阈值(默认为8)并且数组长度大于64,如果满足,将链表转换成红黑树;如果不满足,数组扩容。
  • 扩容时,调用resize( )方法,按原有数组的长度,扩容一倍(即扩容至原有长度的2倍),此时,会根据原数据键的hashcode重新计算数据的存储位置。

5.特点

  • 非线程安全:由于HashMap内部方法未使用synchronized同步锁修饰,所以其是非线程安全的;
  • 执行效率高:由于非线程安全的问题,自然它的执行效率要相比Hashtable高一些;
  • 无序性:由于存储数据时,会用键的hash值与数组长度进行%模运算,计算存储在数组中的位置下标,所以是无序的。
  • 键唯一,值可重复:允许Null key和Null value,Null Key只允许有1个,Null value 可以有多个;

6.影响因素

  • 构建HashMap实例时有两个重要的参数会影响其性能:初始容量和加载因子
  • 初始容量:用来规定哈希表数组的长度,默认为16,因为16是2的整数次幂,在小数据量的情况下,能减少哈希冲突,提高性能。在存储大量数据时,最好先预判数据量,按照2的幂次方,提前预设初始容量。
  • 加载因子:用来表示哈希表中元素的填满程度,默认为0.75,越大则表示允许填满的元素就越多,哈希表的空间利用率就越高,但哈希冲突的机会增加;反之,越小则冲突机会越少,但会造成空间浪费。
  • 所以,在设置初始容量时,应该考虑到初始容量及其加载因子,预估设置初始容量,最大限度的减少rehash重建内部数据结构操作的次数,减少扩容操作。

7.常用方法

① put(k,v) 作用:添加元素
② get(k) 作用:根据key键获取value值(试图访问一个不存在的键值对时,会引发空指针异常)
③ containskey(指定的key) 作用:判断当前集合中是否存在指定的键,返回值为boolean
④ containsvalue(指定的value) 作用:判断当前集合中是否存在指定的value值,返回值为boolean
⑤ remove(指定的key) 作用:按照指定的键删除kv键值对,返回被删除的value值
⑥ replace(指定的key,修改后的新值) 作用:按照指定的键修改kv键值对,返回修改前的value值
⑦ keySet( ) 作用:获取集合中所有的key键,返回Set类型集合
⑧ values( ) 作用: 获取集合中所有的value值,返回Collection类型集合

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值