热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

hashmap简单描述

JDK1.71.数据结构: 数组+链表2.put过程中发生hash碰撞是如何处理的?答:使用“头插法”:将新数据插入当前数组,数组中原数据向链表下(纵向)移动

JDK1.7

  1. 数据结构:  数组+链表

  2. put过程中发生hash碰撞是如何处理的?

    答: 使用 “头插法” :将 新数据 插入当前数组,数组中 原数据 向 链表下(纵向)移动

      

  3. “头插法” 出现的问题?

    答1: 如果一直发生hash碰撞,那么链表就会向下无限的增加下去,链表会变的很长。

       众所周知,链表的特点是:增删快,查询慢。若果链表很长,那么查询就更慢了。

    答2:在多线程的情况下,同一索引位置的节点在扩容后 链表会变成环状 ,导致出现死循环的情况。

  4.什么是hash碰撞?

    答: 两个不同的值(如:张三 、李四),经过hash计算后,得到相同的hash值,后来李四要放到原来张三的位置,但是数组的位置已经被张三占用了,导致的冲突。

JDK1.8

  1. 数据结构: 数组+链表+红黑树

    

  2. put 过程中发生 hash碰撞是如何处理的?

    答: 使用 “尾插法” : 将 新数据 插入当前链表的尾部,使其成为当前链表尾节点。

  3. “尾插法” 解决的问题

    答: 解决“头插法”处出现的死循环

  4. 为什么使用“红黑树”?

    答: 主要是为了提升在hash冲突时(链表过长)的查找性能,使用链表查找性能是O(n) ,使用红黑树查找性能是O(logn) , 提高了查询效率

  5. 什么时候 链表 转 红黑树?

    答:当 链表 长度 大于等于 8 时,由 链表 转成 红黑树

  6. 什么时候 红黑树 转 链表?

    答:当 红黑树上节点数小于等于6时,由 红黑树 转成 链表

  7.  hashmap 什么时候进行扩容 (数组空间不够,需要进行扩容) ?

    答:  数组的默认长度是 :16             扩容因子是 :0.75

       16 * 0.75=12    数组长度使用到12的时候开始扩容

  8. hashmap 是如何扩容的?

    答: 底层是 数组,那么数组是如何扩容的呢?

      寻找一个长度是原数组2倍的新数组进行扩容。

    为什么数组扩容是2倍呢?

      2倍满足,扩容一定的 2的次方 默认要求 ,

      满足这个条件 有利于 计算生成的 hash值 放到hashmap数组中的值(value)更加均匀。

  9. hashmap的put(添加)方法流程

    答: 1. 调用put() 方法   -->底层 调用hashmap类的putval() 方法

       

       2. 首先 根据 key 进行hash运算 

       

       用 key 的 hashCode  与 key的hashcode 右移16位做 异或运算

      3.然后 

  10. 为什么要做hash运算?

     答:查看源码可以看出,通过key计算出 hash值是为了后续key和value放入数组中的位置

        hash值与数组的长度进行计算,放到对应的数组中

        存放到数组中的位置 = key计算出hash值 & n  ( hash值 % 数组的长度(16) = 下标 )

  11. hashmap的重要属性以及有哪些作用?

     答:  <1>  size:hashmap已经存储的节点数

         <2> threshold:扩容阈值,当hashmap的个数达到该值,触发扩容

         <3> loadFactor:负载因子,扩容阈值=容量*负载因子

  12.

 

 

 总结JDK1.8有哪些优化?

   1. 数据结构:

     由“数组+链表” 改成 “数组+链表+红黑树”,主要是优化hash冲突严重时,链表过长的查找性能

  2. 扩容:

     由“头插法” 改成 “尾插法”,避免了并发下的死循环

  3. hsah计算:

    1.8只是简单的进行高16位参与运算

    

 

   4. 其他:

    目前还不太清楚

    

结束语:

  好了,目前小编的技术能力就到这里了,其他问题正在努力学习中......

 

 

 

  

  

  

 

 

 

 

 

 

 



推荐阅读
  • Mybatis源码解析——Executor
    ExecutorExecutor提供了数据库操作的一些方法以及Mybatis的缓存和事物管理功能。模板方法模式要实现某个方法,必须经过很多算法,但这些算法的顺序是固定的,将算法的运 ... [详细]
  • 1、对于List而言,要不然就使用迭代器,要不然就从后往前删除,从前往后删除会出现角标越界。因为我List有两个remove方法,一个是int作为形参(删除指定位置的元素),一个是 ... [详细]
  • JavaBean和Map 转换 用反射方法实现
    由于JavaBean(实体类)结构与Map类似,我们可以把JavaBean与Map进行转换 ... [详细]
  • 实战分析SpringBoot整合JSON,面试题附答案
    前言作为同时具备高性能、高可靠和高可扩 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 服务器性能优化之网络性能优化
    hi,大家好,今天分享一篇后台服务器性能优 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 我有二进制格式的数据(十六进制:803bc8870a89),我需要将其转换为字符串,以便通过Jackcess在MSAccess数据库中保存二进制数据.我知道,我不认为在Java中使用 ... [详细]
  • 结对编程 地铁最短路径 张波朱新远
    结对编程地铁最短路径一、任务:实现一个帮助进行地铁出行路线规划的命令行程序。PSP2.1PersonalSoftwareProcessStagesTimePlanni ... [详细]
  •  //CAUTION:Followtheconfigurationorderforsettingtheports.   //1)settingva ... [详细]
  • 导读:今天编程笔记来给各位分享关于php变量命名规范是什么的相关内容,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录一览: ... [详细]
  • 操作系统基础知识(常用面试题)
    1.进程和线程有什么区别?进程(Process)是系统进行资源分配和调度的基本单位,线程(Thread)是CPU调度和分配 ... [详细]
  • 内容多有疏漏,有问题欢迎提出目录java内存模型的概念原子性(Atomicity)可见性(Visibility࿰ ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
author-avatar
霍任芳
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有