这篇文章仅限小编个人的理解,小编不是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加锁,在锁定的时候别的线程也可以进行访问

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

Java中简单易懂的HashMap面试题(面试必备)的更多相关文章

  1. 深入了解 Java 中的异常处理 + 面试题

    # 深入了解 Java 中的异常处理 + 面试题 在程序开发中,异常处理也是我们经常使用到的模块,只是平常很少去深究异常模块的一些知识点.比如,try-catch 处理要遵循的原则是什么,finall ...

  2. java 中遍历hashmap 和hashset 的方法

    一.java中遍历hashmap:    for (Map.Entry<String, Integer> entry : tempMap.entrySet()) {     String ...

  3. Java中关于HashMap的元素遍历的顺序问题

    Java中关于HashMap的元素遍历的顺序问题 今天在使用如下的方式遍历HashMap里面的元素时 1 for (Entry<String, String> entry : hashMa ...

  4. Java中关于HashMap的使用和遍历(转)

    Java中关于HashMap的使用和遍历 分类: 算法与数据结构2011-10-19 10:53 5345人阅读 评论(0) 收藏 举报 hashmapjavastringobjectiterator ...

  5. [转]为什么Java中的HashMap默认加载因子是0.75

    前几天在一个群里看到有人讨论hashmap中的加载因子为什么是默认0.75. HashMap源码中的加载因子 static final float DEFAULT_LOAD_FACTOR = 0.75 ...

  6. Java中的HashMap的工作原理是什么?

    问答题23 /120 Java中的HashMap的工作原理是什么? 参考答案 Java中的HashMap是以键值对(key-value)的形式存储元素的.HashMap需要一个hash函数,它使用ha ...

  7. 沉淀再出发:java中的HashMap、ConcurrentHashMap和Hashtable的认识

    沉淀再出发:java中的HashMap.ConcurrentHashMap和Hashtable的认识 一.前言 很多知识在学习或者使用了之后总是会忘记的,但是如果把这些只是背后的原理理解了,并且记忆下 ...

  8. 关于Java中的HashMap的深浅拷贝的测试与几点思考

    0.前言 工作忙起来后,许久不看算法,竟然DFA敏感词算法都要看好一阵才能理解...真是和三阶魔方还原手法一样,田园将芜,非常可惜啊. 在DFA算法中,第一步是需要理解它的数据结构,在此基础上,涉及到 ...

  9. java高级&资深&专家面试题-行走江湖必备-持续更新ing

    行走江湖必备一份面试题,这里给大家整理了一套.0面试官最喜欢问的问题或者出场率较高的面试题,助校招或者社招路上的你一臂之力! 首先我们需要明白一个事实,招聘的一个很关键的因素是在给自己找未来的同事,同 ...

  10. Java中的HashMap

    今天到中关村软件园面试被问到Java中HashMap的存值原理,瞬间无言已对,回答用了一个数组,然后沉默,面试官说,一次的面试失败不算什么,之后...... 1.关于hashCode hashCode ...

随机推荐

  1. unity笔记001

    熟悉场景和物体的基本操作,q移动场景,e旋转物体,放大缩小,V键顶点吸附,相比快捷键,还是喜欢用xyz参数控制

  2. js给ul下面所有的li追加类名

  3. window 画工业图软件

    1.autoCAD 2.visio 3.CorelDraw 4.DrawIO

  4. VMWare 12 Mac 10.11 XCode 7.3 Ipad真机调试重要问题总结

    XCode 7.3可以不需要每年缴费而直接调试IOS应用,测试如下: 1,安装Mac 10.11在VMWare12上,网上有很多例子.注意: 1.1,虚拟机设置中USB为USB2.0,不能是3.0或其 ...

  5. 记一次在MyBatis-Plus中 @TableField 自动填充中遇见的坑

    先放一张表生成策略对应的结果 值 描述 DEFAULT 默认不处理 INSERT 插入时填充字段 UPDATE 更新时填充字段 INSERT_UPDATE 插入和更新时填充字段 此处需要注意一下,如果 ...

  6. Node Sass version 7.0.1 is incompatible with ^4.0.0 node-sass 问题

    执行旧版项目安装依赖时报错 卸载 npm uninstall node-sass sass-loader 安装(need Python27) npm install sass-loader@7.3.1 ...

  7. Linux 使用Samba或NFS实现文件共享

    SAMBA文件共享服务 Samba是一款开源的文件共享软件,经过简单配置就能够实现Linux系统与Windows系统之间的文件共享工作. 例1:配置Samba服务前,先删掉Samba服务主配置文件中的 ...

  8. 项目实训 DAY 13

    GraphCore学习成本太高/现有资料太少,决定放弃 PlotNN用python语言生成pdf(需求:png),且不能通过仅运行python程序实现,python内生成的是tex格式,还需要加一行命 ...

  9. Liunx mosquitto卸载

    1.查询文件: whereis mosquitto whereis mosquitto_sub 2.删除查询到的文件,命令: rm -rf /etc/mosquitto rm -f /usr/loca ...

  10. java初学者-手动输入一个整数,打印这个数是几位数

    import.java.until.Scanner; //手动输入一个整数,打印这个数是几位数 public static void main(String[]args){ //键盘录入 Scanne ...