hashmap面试题简书_三年php面试题

hashmap面试题简书_三年php面试题这篇文章仅限小编个人的理解,小编不是Java方向的,只是对Java有很高的学习兴趣如果有什么不对的地方还望大佬指点HashMap的底层是数组+链表,(很多人应该都知道了)JDK1.7的是数组+链表(1.7只是一个例子,以前的话也是这样后面就以1.7为例子了)首先是一个数组,然后数组的类型是链表元素是头插法JDK1.8的是数组+链表或者数组+红黑树首先是一个数组,然后数组的类型是链表在链表的元素大于8的时候,会变成红黑树在红黑树的元素小于6的时候会变成链表元素进行尾插HaspM.

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

这篇文章仅限小编个人的理解,小编不是Java方向的,只是对Java有很高的学习兴趣
如果有什么不对的地方还望大佬指点

HashMap的底层是数组+链表,(很多人应该都知道了)
JDK1.7的是数组+链表
(1.7只是一个例子,以前的话也是这样后面就以1.7为例子了)
首先是一个数组,然后数组的类型是链表
元素是头插法
JDK1.8的是数组+链表 或者 数组+红黑树
首先是一个数组,然后数组的类型是链表
在链表的元素大于8的时候,会变成红黑树
在红黑树的元素小于6的时候会变成链表
元素进行尾插

HaspMap的数组默认大小为16
数组也叫做Hash桶
(貌似听说这个值和阿里巴巴Java开发手册好像有点关系)

HashMap元素的下标是
HashCode(元素) & (数组的长度-1)

HashMap的扩容 Resize

扩容的话,这里有一个值叫做loadFactor(阈值),默认值为0.75;
当数组的 元素数量>数组大小(默认16)* loadFactor(默认0.75)
就会触发扩容,扩容是二倍扩容的 (默认是16扩容后就是32)
这时原来每个元素的下标也会改变的(因为数组的长度变了)
然后就要把每个元素重新分配下标,重新加入链表或者红黑树

HashMap线程不安全
在put的时候,Resize(扩容)会造成数据的覆盖
JDK1.7 因为是头插法,可能会造成循环链表
JDK1.8 是尾插法

使用HashMap怎么才能让他线程安全
使用ConcurrentHashMap,
JDK1.7的是分段数组,有Segment锁(继承于ReentrantLock)加速一小段保证并发
JDK1.8 是和HashMap一样了,数组+链表(或者红黑树)
Synchronized(锁)and CAS(compare and swap)
(JVM在1.6对Synchronize的优化很好)
CAS通俗易懂,比较并替换
(CAS是一种无锁算法,CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做)
(无锁化的修改值的操作,他可以大大降低锁代理的性能消耗。这个算法的基本思想就是不断地去比较当前内存中的变量值与你指定的 一个变量值是否相等,如果相等,则接受你指定的修改的值,否则拒绝你的操作。因为当前线程中的值已经不是最新的值,你的修改很可能会覆盖掉其他线程修改的结果。这一点与乐观锁,SVN的思想是比较类似的)

使用HashTable(基本是废弃的)
HashTable就是把HashMap套上了一个Synchronized

Collections.synchronizedMap()包装
使用synchronized 加上,但是这个是对某个Hash桶(数组的某个值)加锁,并不是整个map加锁,在锁定的时候别的线程也可以进行访问

小编暂时就了解这个多了,有什么遗漏的还望大佬评论

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/169547.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 说说anchorPoint[通俗易懂]

    说说anchorPoint[通俗易懂]anchorPoint属性是CGPoint(x,y),x,y的取值是按比例取值,一般用0~1,默认是(0.5,0.5),表示图层的position在自身的位置,举个例子,在红色view确定完大小位

    2022年7月3日
    40
  • 基于android餐馆点餐系统报告感想,基于Android的餐厅点餐系统的设计与实现

    基于android餐馆点餐系统报告感想,基于Android的餐厅点餐系统的设计与实现摘要:民以食为天,在日常的生活中,我们经常需要与家人,朋友,同事在一起就餐以便促进相互之间的感情.但是现在多数的餐厅企业基本上还是手工点餐操作,无法更好地适应新时期下人们对餐饮业服务的人性化和高效率的要求.随着”互联网+”思维的不断推广,使得传统行业和互联网行业相结合的新兴产业也不断迅速发展.在当前社会形势下安卓系统得到了迅速发展和广泛应用,它正在悄无声息的改变着人们的生活,也为餐厅点餐信息化技术…

    2022年6月19日
    24
  • <LeetCode OJ> 337. House Robber III

    <LeetCode OJ> 337. House Robber III

    2022年3月5日
    48
  • C++ map遍历(简单易记忆)[通俗易懂]

    C++ map遍历(简单易记忆)[通俗易懂]C++中map遍历有两种方法:第一种,使用迭代器,while循环#include<iostream>#include<map>usingnamespacestd;intmain(){ map<int,int>p; p[0]=1; p[1]=2; p[3]=4; map<int,int>::iteratori…

    2022年9月21日
    6
  • glassfish是什么_cleairaquatics鱼缸说明书

    glassfish是什么_cleairaquatics鱼缸说明书一、glassfish简介glassfish是一款web应用服务器,和tomcat一样,也是一款优秀的Servlet容器。二、glassfish知识点1、domain域domain是glassfish中,拥有独立端口的存放web应用的容器。glassfish可以创建多个domain,每个domain存放于glassfish/domains目录中。每个domain是可以部署多…

    2022年8月20日
    8
  • 自动化测试框架[Cypress PO模式]

    自动化测试框架[Cypress PO模式]【附源码】在Cypress中并不认为PO是个很好的模式,Cypress认为跨页面共享逻辑是一个反模式(Anti-Pattern),在Cypress中,它提供了很多方式,允许用户通过更简单的方式直接设置被测应用程序达到的待测试状态,不需要再不同页面一遍又一遍的执行相通操作

    2022年6月1日
    38

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号