服装东莞网站建设做淘宝网站需要

张小明 2025/12/30 6:13:33
服装东莞网站建设,做淘宝网站需要,猎上网登陆官方网站,网站建设新技术Map 是 Java 集合框架中双列集合的核心接口#xff0c;隶属于 java.util 包#xff0c;与 Collection 接口#xff08;单列集合#xff09;并列#xff0c;专门用于存储 “键#xff08;Key#xff09;- 值#xff08;Value#xff09;” 映射关系。相较于单列集合隶属于java.util包与Collection接口单列集合并列专门用于存储 “键Key- 值Value” 映射关系。相较于单列集合Map 更侧重 “通过键快速查找值” 的场景其设计思想和底层原理是 Java 集合体系的核心知识点。一、Map 接口的核心设计原则1. 键值对的映射规则一对一映射一个键Key只能关联一个值Value向 Map 中插入相同键的新值时会覆盖原有值并返回被覆盖的旧值put方法的返回值特性。键的唯一性Map 不允许重复的键“重复” 的判定依赖键对象的hashCode()和equals()方法 —— 两个键对象若equals()返回true且hashCode()返回值相同则视为同一个键。值的可重复性值无需满足唯一性多个不同的键可以映射到同一个值。2. 空值处理规则HashMap、LinkedHashMap允许键为null仅允许一个允许值为null多个Hashtable、ConcurrentHashMap不允许键或值为null避免空指针适配多线程场景TreeMap键不能为null依赖比较器 / 自然排序null无法参与比较值可以为null。二、Map 核心实现类的底层原理1. HashMapJDK 8 及以上核心结构底层为 “数组 链表 红黑树”数组Node [] table存储键值对的哈希桶默认初始容量 162^4扩容因子 0.75扩容后容量为原 2 倍保证哈希计算的均匀性链表当多个键的哈希值冲突映射到同一数组下标时先以链表形式存储链表长度阈值为 8红黑树当链表长度 ≥ 8 且数组容量 ≥ 64 时链表转为红黑树降低查找时间复杂度从 O (n) 到 O (logn)若后续删除元素导致树节点数 ≤ 6红黑树转回链表。哈希计算与索引定位计算键的hashCode()对哈希值进行扰动处理hash key.hashCode() ^ (key.hashCode() 16)高位参与运算减少哈希冲突计算数组下标index hash (table.length - 1)等价于取模效率更高前提是数组容量为 2 的幂。线程安全性非线程安全多线程下扩容resize()可能导致链表成环插入 / 删除操作可能出现数据丢失解决方式使用ConcurrentHashMapJDK 8 后基于 CAS synchronized 实现性能优于Hashtable。2. LinkedHashMap核心特性继承自HashMap底层额外维护一个双向链表记录键值对的插入顺序 / 访问顺序有序性默认按 “插入顺序” 遍历也可通过构造器指定accessOrder true实现 “访问顺序”每次get/put访问的元素会移到链表尾部适用于实现 LRU 缓存。底层实现重写HashMap的Node节点新增before和after指针用于构建双向链表重写newNode()、afterNodeAccess()、afterNodeInsertion()等方法维护双向链表的节点顺序。3. TreeMap核心结构底层为红黑树自平衡的二叉查找树无哈希表结构因此无需考虑哈希冲突有序性按键的 “自然顺序”如 Integer 升序、String 字典序或自定义Comparator排序遍历结果始终有序。键的要求键必须实现Comparable接口自然排序或创建TreeMap时指定Comparator自定义排序若键未实现Comparable且无自定义比较器调用put时会抛出ClassCastException。核心方法ceilingKey(K key)返回大于等于指定键的最小键floorKey(K key)返回小于等于指定键的最大键subMap(K fromKey, K toKey)获取键在指定范围的子 Map视图原 Map 变更会同步。4. Hashtable古老实现几乎淘汰底层为 “数组 链表”无红黑树优化线程安全所有方法加synchronized锁锁整个对象并发效率低容量默认初始容量 11非 2 的幂扩容因子 0.75扩容后容量 原容量 × 2 1已被ConcurrentHashMap替代仅兼容旧代码场景。5. ConcurrentHashMapJDK 8 核心实现底层为 “数组 链表 红黑树”与HashMap结构类似线程安全数组分段锁不再使用 JDK 7 的分段锁Segment改为对数组单个桶Node加synchronized锁锁粒度更小并发效率更高CAS 操作对桶的初始化、节点的插入等无冲突操作使用 CAS 保证原子性避免加锁。不允许键 / 值为null避免多线程下null值的歧义无法区分 “键不存在” 和 “值为 null”。三、Map 的遍历方式与性能分析1. 核心遍历方式遍历方式实现方式优点缺点键遍历keySet ()for (K key : map.keySet()) { V value map.get(key); }代码简洁需两次哈希查找keySet 遍历一次get 一次效率低键值对遍历entrySet ()for (Map.EntryK,V entry : map.entrySet()) { K key entry.getKey(); V value entry.getValue(); }一次遍历获取键值效率最高代码稍繁琐迭代器遍历IteratorIteratorMap.EntryK,V iterator map.entrySet().iterator(); while (iterator.hasNext()) { ... }支持遍历中删除元素iterator.remove ()代码繁琐forEach 遍历JDK 8map.forEach((k, v) - { ... });函数式编程代码简洁无法遍历中删除元素需用 removeIf2. 性能对比最优entrySet()遍历仅一次哈希计算直接获取键值对次优forEach 遍历底层基于 entrySet语法简化最差keySet()get()两次哈希查找哈希冲突时性能更差。四、自定义对象作为 Map 键的注意事项1. 必须重写hashCode()和equals()原因Map 依赖这两个方法判断键的唯一性若不重写默认使用 Object 类的实现equals()比较对象地址导致即使内容相同的两个对象被视为不同键hashCode()返回对象的内存地址哈希值导致相同内容的对象哈希值不同映射到不同数组桶。2. 重写原则一致性若两个对象equals()返回true则hashCode()必须返回相同值若equals()返回falsehashCode()尽量返回不同值减少哈希冲突稳定性hashCode()的返回值在对象生命周期内不能改变若键对象的属性参与哈希计算需保证属性不可变或避免修改参与计算的属性。3. 示例代码class Student { private String id; private String name; // 构造器、getter/setter 省略 // 重写 equals() Override public boolean equals(Object o) { if (this o) return true; if (o null || getClass() ! o.getClass()) return false; Student student (Student) o; return Objects.equals(id, student.id); // 以唯一标识 id 作为判断依据 } // 重写 hashCode() Override public int hashCode() { return Objects.hash(id); // 仅基于 id 计算哈希值 } } // 使用自定义对象作为键 MapStudent, Integer scoreMap new HashMap(); scoreMap.put(new Student(001, 张三), 90); scoreMap.put(new Student(001, 张三), 95); // 覆盖原有值equals 返回 true System.out.println(scoreMap.size()); // 输出 1五、Map 的扩容机制以 HashMap 为例1. 扩容触发条件当 Map 中键值对数量size≥ 数组容量 × 扩容因子默认 16 × 0.75 12时触发扩容当链表转红黑树时若数组容量 64先扩容数组而非转树避免小容量下频繁转树。2. 扩容流程创建新数组容量为原数组的 2 倍遍历原数组的所有节点重新计算节点在新数组的下标因容量翻倍下标仅可能为原下标或原下标 原容量将节点迁移到新数组红黑树节点需拆分链表节点直接迁移替换原数组为新数组完成扩容。六、Map 与 Collection 的核心区别维度MapCollection存储形式键值对双列单个元素单列核心子接口HashMap、TreeMap、ConcurrentHashMap 等List、Set、Queue 等元素唯一性键唯一值可重复Set 元素唯一List 元素可重复遍历方式键遍历、键值对遍历、值遍历直接遍历、迭代器遍历核心方法put、get、remove按键操作add、remove、contains按元素操作七、常见面试考点总结HashMap JDK 7 与 JDK 8 的区别JDK 7 为 “数组 链表”JDK 8 新增红黑树优化哈希计算扰动方式简化扩容迁移逻辑优化HashMap 为什么线程不安全扩容成环、数据丢失、可见性问题ConcurrentHashMap 线程安全实现方式JDK 7 分段锁SegmentJDK 8 CAS 桶级 synchronizedTreeMap 排序原理基于红黑树的自然排序 / 自定义比较器LinkedHashMap 实现 LRU 缓存通过accessOrder true让访问过的元素移到链表尾部淘汰链表头部元素。总结Map 是 Java 中处理键值对映射的核心工具不同实现类适配不同场景无顺序要求、追求高性能HashMap需保持插入 / 访问顺序LinkedHashMap需按键排序TreeMap多线程并发场景ConcurrentHashMap避免使用Hashtable性能差、API 老旧。掌握 Map 的底层原理和使用规范是优化 Java 程序性能、避免并发问题的关键。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

wordpress添加搜索栏seo公司 上海

[1]模型简介:COMSOL Multiphysics进行负压抽采瓦斯数值模拟研究,主要研究瓦斯压力及应力变化。 [2]案例内容:数值模型一个 [3]模型特色:详见图片,学习流固耦合,在此基础上进行进一步的学习。 最近在研究CO…

张小明 2025/12/26 16:40:07 网站建设

江苏建设监理协会网站昆山网站建设首页

【收藏学习】网络安全实战指南:护网经验、漏洞分析与应急响应全攻略 本文全面介绍网络安全核心知识,涵盖护网面试流程、岗位分类、信息收集技术、各类漏洞原理与利用方法(SQL注入、XSS、CSRF等)、应急响应流程及溯源技术。内容从…

张小明 2025/12/26 16:40:10 网站建设

php网站开发 教案上海网络推广团队

一、Vue CLI 3.X 脚手架安装与使用 1. 安装前提 - 确保已安装 Node.js 8.9(推荐 10 版本),终端输入 node -v 验证版本。 - 若未安装 Node.js,前往 Node.js 官网 下载对应系统版本(建议勾选“Add to PATH”自动配置…

张小明 2025/12/26 16:40:08 网站建设

网站建设简单合同那个网站做720度效果图

LLTwoBot:零基础搭建智能QQ机器人的完整指南 【免费下载链接】LiteLoaderQQNT-OneBotApi NTQQ的OneBot API插件 项目地址: https://gitcode.com/gh_mirrors/li/LiteLoaderQQNT-OneBotApi 还在为复杂的机器人配置烦恼吗?🤔 每天都有无数…

张小明 2025/12/26 16:40:07 网站建设

wordpress建手机站东莞网站开发定制

EmotiVoice语音合成结果的情感误判率统计分析 在虚拟偶像的直播中,一句本应充满喜悦的台词却以平淡甚至悲伤的语调说出——观众瞬间出戏;在智能客服系统里,用户表达不满时,AI却用欢快的语气回应,引发强烈反感。这类问题…

张小明 2025/12/26 16:40:09 网站建设

万网提供的网站建设服务的具体项目阿里云linux安装wordpress

敏捷软件开发:从阶段视角的全面解析 1. 敏捷开发阶段概述 许多人从阶段视角学习软件开发,按顺序执行各个阶段,常见阶段包括分析、需求、设计、开发、测试和交付。敏捷软件开发并非按顺序进行,但可以以串行方式建模,以便更轻松地设想过程。 以下是各阶段的简要概述,各阶…

张小明 2025/12/26 16:40:09 网站建设