热门标签 | 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. 其他:

    目前还不太清楚

    

结束语:

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

 

 

 

  

  

  

 

 

 

 

 

 

 



推荐阅读
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • MySQL索引详解与优化
    本文深入探讨了MySQL中的索引机制,包括索引的基本概念、优势与劣势、分类及其实现原理,并详细介绍了索引的使用场景和优化技巧。通过具体示例,帮助读者更好地理解和应用索引以提升数据库性能。 ... [详细]
  • Yii 实现阿里云短信发送 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 使用GDI的一些AIP函数我们可以轻易的绘制出简 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • PHP 编程疑难解析与知识点汇总
    本文详细解答了 PHP 编程中的常见问题,并提供了丰富的代码示例和解决方案,帮助开发者更好地理解和应用 PHP 知识。 ... [详细]
  • Python 异步编程:深入理解 asyncio 库(上)
    本文介绍了 Python 3.4 版本引入的标准库 asyncio,该库为异步 IO 提供了强大的支持。我们将探讨为什么需要 asyncio,以及它如何简化并发编程的复杂性,并详细介绍其核心概念和使用方法。 ... [详细]
  • C++实现经典排序算法
    本文详细介绍了七种经典的排序算法及其性能分析。每种算法的平均、最坏和最好情况的时间复杂度、辅助空间需求以及稳定性都被列出,帮助读者全面了解这些排序方法的特点。 ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • 本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ... [详细]
  • 汇编语言等号伪指令解析:探究其陡峭的学习曲线
    汇编语言以其独特的特性和复杂的语法结构,一直被认为是编程领域中学习难度较高的语言之一。本文将探讨汇编语言中的等号伪指令及其对初学者带来的挑战,并结合社区反馈分析其学习曲线。 ... [详细]
  • PHP数组平均值计算方法详解
    本文详细介绍了如何在PHP中计算数组的平均值,涵盖基本概念、具体实现步骤及示例代码。通过本篇文章,您将掌握使用PHP函数array_sum()和count()来求解数组元素的平均值。 ... [详细]
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社区 版权所有