这篇文章仅限小编个人的理解,小编不是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. studiostyl.es网站scheme文件无法下载

    原因网站引用Google的服务 解决方法:查看网页源码.选择选取页面中的元素,选择download按钮,如下图所示 downloadExisting后面的数字代表主题的ID. 在网站中输入https: ...

  2. EF Core如何到回滚上一次迁移

    update-database 上上次迁移记录 让数据库回滚 remove-migration 删除本次有误的迁移文件 修改完毕后 add-migration updata-database 完成

  3. k8s master节点高可用 nginx+keepalived配置文件

    nginx配置 user nginx; worker_processes auto; error_log /var/log/nginx/error.log; pid /run/nginx.pid; i ...

  4. Software--EB--Project 身份验证

    2018-01-09  16:57:51 身份验证服务 应该有两种形式得身份验证机制: 1. 在其他网站上又 Web 账号得顾客在注册或登陆到该网站时候应该能够使用这些账号. 2.没有的顾客或者希望新 ...

  5. 040_Field Set

    Field Set是一组字段.例如,您可以有一个Field Set,其中包含描述用户的名字,中间名,姓氏和业务标题的字段.将Field Set添加到Visualforce页面时,开发人员可以遍历字段并 ...

  6. 逆向学习物联网-网关ESP8266-02模块AT指令的测试

    1.硬件测试环境搭建 https://item.taobao.com/item.htm?spm=a1z09.2.0.0.58582e8dOkitcE&id=623715787845&_ ...

  7. Delphi实现大写字母键打开提示

    uses XPMan 编辑框的passwordChar属性设置成 *

  8. 什么是压测,为什么要进行压力测试?Jmeter工具的使用

    1.背景介绍 什么是压测? 压力测试是通过不断向被测系统施加"压力",测试系统在压力情况下的性能表现,考察当前软硬件环境下系统所能承受的最大负荷并帮助找出系统瓶颈所在,也就是我们可 ...

  9. 非线性优化-SLAM14CP6

    在前声明下面有一部分直接引用高翔老师SLAM14讲中的内容.因为我实在是看不懂.临时放在这里.以后有用到再做详细研究. 在SLAM14讲的CP2中第一次引入运动方程以及观测方程来描述物体带着传感器在空 ...

  10. python学习笔记-简介

    python简介 python是一种简单易学,功能强大的编程语言,他有高效的高层数据结构,简单而有效的实现面向对象编程.python是一种解释性语言,在多数平台的多个领域都是理想的脚本语言,特别适用于 ...