当前位置: 首页 > news >正文

盐城城南建设局一局网站帮公司做网站赚钱吗

盐城城南建设局一局网站,帮公司做网站赚钱吗,个人旅游网站模版,想制作一个网站怎么来做在 Java 面试中,HashMap 是必问的核心知识点,以下是高频问题和深度解析框架,助你系统性掌握:一、基础概念HashMap 的本质是什么? 基于哈希表的 Map 接口实现,存储键值对(Key-Value)非…

在 Java 面试中,HashMap 是必问的核心知识点,以下是高频问题和深度解析框架,助你系统性掌握:


一、基础概念

  1. HashMap 的本质是什么?

    • 基于哈希表的 Map 接口实现,存储键值对(Key-Value
    • 非线程安全ConcurrentHashMap 才是线程安全方案)
    • 允许 null 键和 null
  2. 底层数据结构?

    • JDK 1.7:数组 + 链表(冲突时链表头插)
    • JDK 1.8+:数组 + 链表/红黑树(链表长度≥8转红黑树,≤6退化成链表)

二、核心机制深度剖析

1. 哈希冲突解决
  • 扰动函数(Hash算法)

    // JDK 1.8 的 hash() 方法
    static final int hash(Object key) {int h;return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
    }
    

    作用:高16位异或低16位,分散哈希值,减少碰撞

  • 索引计算
    index = (n - 1) & hashn 为桶数组长度)

2. 扩容机制(重点!)
  • 触发条件
    元素数量 > 容量(Capacity) × 负载因子(Load Factor)
    (默认容量=16,负载因子=0.75)

  • 扩容流程

    1. 创建新数组(2倍原大小)
    2. 遍历旧数组的每个桶:
      • 链表节点:拆分成 低位链表(原索引)和 高位链表(原索引+旧容量)
      • 红黑树节点:按相同逻辑拆分,若拆分后节点≤6则退化成链表
    3. 将链表/树放入新数组对应位置
  • JDK 1.7 死链问题
    多线程扩容时头插法可能导致循环链表(JDK 1.8 改用尾插法解决)

3. 树化与退化
  • 树化条件
    链表长度 ≥ TREEIFY_THRESHOLD(默认 8) 桶数组长度 ≥ MIN_TREEIFY_CAPACITY(默认 64)
  • 退化条件
    树节点数量 ≤ UNTREEIFY_THRESHOLD(默认 6)
4. 为什么长度总是 2 的幂次方?
  • 索引计算优化
    (n - 1) & hash 等价于 hash % n,但位运算效率远高于取模
  • 扩容时节点迁移优化
    节点在新桶的位置只有两种可能:原位置 或 原位置+旧容量(无需重新计算哈希)

三、高频进阶问题

1. 线程不安全场景分析
  • 数据覆盖:多线程同时 put 时可能覆盖值
  • 死循环:JDK 1.7 扩容时头插法导致循环链表(已修复)
  • 解决方案
    Collections.synchronizedMap()ConcurrentHashMap
2. 为什么树化阈值是 8?退化阈值是 6?
  • 泊松分布统计依据
    哈希冲突达到 8 的概率不足千万分之一
    (源码注释明确说明:Because TreeNodes are twice the size of regular nodes
  • 避免频繁转换:设置 6 和 8 的差值防止临界值附近反复转换
3. Key 的设计要求
  • 不可变性
    Key 对象修改了影响 hashCode() 的字段,将无法通过 get() 找到原值
  • 重写 hashCode()equals()
    • 未重写 hashCode() → 不同实例可能被放入不同桶(逻辑相等但物理不等)
    • 未重写 equals() → 无法正确识别重复 Key

四、手撕源码技巧

1. put() 流程伪代码
1. 计算 Key 的 hash 值
2. 若桶数组为空 → 初始化(默认大小 163. 计算桶索引 i = (n-1) & hash
4. 情况1:桶为空 → 直接插入新节点
5. 情况2:桶为链表 → 遍历链表:- 找到 Key 相等节点 → 更新 Value- 未找到 → 尾部插入新节点
6. 情况3:桶为红黑树 → 调用树节点插入方法
7. 插入后判断:- 链表长度 ≥ 8 → 尝试树化(需数组长度 ≥ 64- 元素总数 > 容量×0.75 → 扩容
2. get() 流程
1. 计算 Key 的 hash 值
2. 定位桶位置:i = (n-1) & hash
3. 情况1:桶为链表 → 遍历查 Key
4. 情况2:桶为红黑树 → 调用树查找方法

五、实战避坑指南

  1. 避免使用可变对象作 Key
    (如 List、自定义类未冻结关键字段)
  2. 初始化时预估容量
    // 避免频繁扩容
    new HashMap<>(expectedSize * 4 / 3 + 1);
    
  3. 高并发场景用 ConcurrentHashMap
    (或用 Collections.synchronizedMap() 包装)

六、面试回答模板

面试官:请说明 HashMap 的工作原理
回答框架

  1. 数据结构:数组+链表/红黑树(说明版本差异)
  2. 核心流程:put 时的哈希计算、冲突解决、扩容触发条件
  3. 性能关键:负载因子作用、树化设计思想
  4. 安全警告:线程不安全场景及替代方案
  5. 最佳实践:Key 设计原则和容量初始化建议

终极提示:结合源码(如 HashMap.putVal())和绘图(桶结构/扩容迁移)讲解,能极大提升面试官认可度!掌握这些,HashMap 相关面试题将迎刃而解。

http://www.dtcms.com/a/616277.html

相关文章:

  • 北京有多少家网站星河东莞网站建设
  • 上海专做特卖的网站wordpress 好seo吗
  • 谷歌搜图柳市网站优化
  • C语言编译器的选择与使用
  • Clip:Learning Transferable Visual Models From Natural Language Supervision
  • 湟源县wap网站建设公司十大网页游戏排行
  • 工业皮带怎么做免费的网站加盟产品网站建设方案
  • 哪些可以免费做网站网站开发与设计实训报告1000字
  • 昆明市住房和城乡建设局门户网站军事新闻最新消息中国视频
  • 高端网站建设 房产深圳华强北电子商城
  • 在柬埔寨做网络销售推网站怎样换wordpress域名
  • 万远翔网站建设河南省工程建设业协会网站
  • 新网站seo技术wordpress修改自适应
  • 做标记网站做商城网站的企业
  • 建设银行官方网站公司鹤壁 网站建设
  • 莆田建设信息网站凡科网商城充值
  • 当今做那些网站能致富怎么能创建自己的网站
  • 房产信息查询系统官方网站徐州网站建设网站制作
  • 工作室装修网站源码wordpress 提请审批
  • 网站建设连接数据库佛山市桂城建设局网站
  • 不用备案的网站各种软件开发定制
  • 淮安做网站公司网页制作教程(第三版)
  • C语言在线编译器开发 | 提供高效编程体验与实时错误反馈
  • 上海网站建设021360怎么夸一个网站开发公司
  • 国外特效网站美团网站开发
  • 办个网站多少钱网站数据库迁移
  • 做网站的图片传进去很模糊flash属于网页制作平台吗
  • 附近做网站的公司在线制作国庆头像
  • LLM零样本提示技术:核心要点+实用提示示例
  • 定制型网站 成功案例网络搭建与维护是什么