《Java 核心技术面试》课程笔记(九)

news2024/10/6 12:21:10

对比 Hashtable、HashMap、TreeMap 有什么不同?

典型回答

  • Hashtable、HashMap、TreeMap 都是最常见的⼀些 Map 实现,是以键值对的形式存储和操作数据的容器类型。
  • Hashtable 是早期 Java 类库提供的⼀个哈希表实现,本身是同步的,不支持 null 键和值,由于同步导致的性能开销,所以已经很少被推荐使用。
  • HashMap 是应用更加广泛的哈希表实现,行为上大致上与 HashTable 一致,主要区别在于 HashMap 不是同步的,支持 null 键和值等。
  • TreeMap 则是基于红黑树的⼀种提供顺序访问的 Map,和 HashMap 不同,它的 get、put、remove 之类操作都是 O(log(n))的时间复杂度,具体顺序可以由指定的 Comparator 来决定,或者根据键的自然顺序来判断。

考点分析

  • 面试官钟爱考察 HashMap 的设计和实现细节:
    • 理解 Map 相关类似整体结构,尤其是有序数据结构的⼀些要点。
    • 从源码去分析 HashMap 的设计和实现要点,理解容量、负载因子等,为什么需要这些参数,如何影响 Map 的性能,实践中如何取舍等。
    • 理解树化改造的相关原理和改进原因。

知识扩展

  • Map 整体结构
    在这里插入图片描述
    • Hashtable 比较特别,作为类似 Vector、Stack 的早期集合相关类型,它是扩展了 Dictionary 类的,类结构上与 HashMap 之类明显不同。
    • HashMap 等其他 Map 实现则是都扩展了 AbstractMap,大部分使用 Map 的场景,通常就是放入、访问或者删除,而对顺序没有特别要求,HashMap 在这种情况下基本是最好的选择。
    • HashMap 的性能表现非常依赖于哈希码的有效性,请务必掌握 hashCode 和 equals 的一些基本约定:
      • equals 相等,hashCode 一定要相等。
      • 重写了 hashCode 也要重写 equals。
      • hashCode 需要保持一致性,状态改变返回的哈希值仍然要一致。
      • equals 的对称、反射、传递等特性。
    • LinkedHashMap 通常提供的是遍历顺序符合插入顺序,它的实现是通过为条目(键值对)维护一个双向链表。注意,通过特定构造函数,我们可以创建反映访问顺序的实例,所谓的 put、get、compute 等,都算作“访问”。
    • 对于 TreeMap,它的整体顺序是由键的顺序关系决定的,通过 Comparator 或 Comparable(自然顺序)来决定。
  • HashMap 构造分析
    • HashMap 内部的结构,它可以看作是数组和链表结合组成的复合结构,数组被分为⼀个个桶(bucket),通过哈希值决定了键值对在这个 数组的寻址;
    • 哈希值相同的键值对,则以链表形式存储,如果链表大小超过阈值(TREEIFY_THRESHOLD, 8),链表就会被改造为 树形结构。
    • 容量和负载系数决定了可用的桶的数量,空桶太多会浪费空间,如果使用的太满则会严重影响操作的性能。
    • 在元素放置过程中,如果一个对象哈希冲突,都被放置到同一个桶里,则会形成一个链表,我们知道链表查询是线性的,会严重影响存取性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/543827.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GE H201TI 全系统自检和自诊断

Hydran 201Ti是一个小型在线预警发射器。它永久安装在变压器上,将为工作人员提供各种故障气体复合值的单一ppm读数,以提醒他们潜在的问题。 可以下载该值,并且可以将警报设置在预定水平,以提醒人员并能够监控发展中的故障状况。 …

作为一位php程序员应具要有那些能力

最近,随着信息技术的发展,更多的人开始关注PHP程序员的职业发展,并渴望成为一名高薪稳定就业的PHP程序员。但是,想要成为一名优秀的PHP程序员,并不仅仅需要掌握PHP的语言基础,还需要具备其他的技能和能力。…

本地代码提交到gitee

提交步骤 注意:该步骤需要使用git工具,请提前下载 参考文章1:如何将本地代码上传到 gitee 该博客包含了gitee创建仓库流程 参考文章2:Git push命令报hint: Updates were rejected because the remote contains work that you do问…

【论文阅读笔记】Federated Unlearning with Knowledge Distillation

个人阅读笔记,如有错误欢迎指出 Arxiv 2022 [2201.09441] Federated Unlearning with Knowledge Distillation (arxiv.org) 问题: 法律要求客户端有随时要求将其贡献从训练中消除的权利 让全局模型忘记特定客户的贡献的一种简单方法是从头开始对模型进…

【机器视觉4】双目立体视觉标定

双目立体视觉标定的目的是标定左、右两个摄像机之间的坐标转换关系。 双目立体视觉的标定过程:采用MATLAB图像处理和计算机视觉库中的 Stereo Camera Calibrator(SCC)来标定双目立体视觉系统中左、右摄像机并获得左右摄像机的内参矩阵 M 1 M_1 M1​、 M 2 M_2 M2​…

Midjourney|文心一格prompt教程[技巧篇]:生成多样性、增加艺术风格、图片二次修改、渐进优化、权重、灯光设置等17个技巧等你来学

Midjourney|文心一格prompt教程[技巧篇]:生成多样性、增加艺术风格、图片二次修改、渐进优化、权重、灯光设置等17个技巧等你来学 1.技巧一:临摹 我认为学习图片类的 prompt,跟学习画画是类似的,最好的学习方法不是直接用模板。…

【FMC155】2 路14-bit、500MSPS/1GSPS/1.25GSPS 直流耦合ADC 同步采集FMC 子卡模块(AD9680)中文资料

板卡概述 FMC155 是一款基于VITA57.1 标准的,实现2 路14-bit、500MSPS/1GSPS/1.25GSPS 直流耦合ADC 同步采集FMC 子卡模块。该模块遵循VITA57.1 规范,可直接与FPGA 载卡配合使用,板卡ADC 器件采用ADI 的AD9680 芯片,该芯片具有两…

结合Sqoop练习一下columns、where和query参数

1、前期的数据准备 1》创建一个学生表 create table student(id char(30),name char(30),age int,phone char(100),address char(100)); 2》插入数据 insert into student values("1001","zhanghuan","21","1111","guiyang&q…

wpf工程中加入Hardcodet.NotifyIcon.Wpf生成托盘

1、在项目中用nuget引入Hardcodet.NotifyIcon.Wpf。如下图所示。 2、在App.xaml中创建托盘界面&#xff0c;代码是写在 App.xaml 里面 注意在application中一定要加入这一行代码&#xff1a; xmlns:tb"http://www.hardcodet.net/taskbar" 然后在<Application.Re…

科研热点| 慎投!3本期刊被剔除SCIE, 5月SCIE/SSCI目录已更新 (附下载)~

2023年5月18日&#xff0c;科睿唯安更新了Web of Science核心期刊目录&#xff0c;此次更新后SCIE期刊目录共包含9503本期刊&#xff0c;SSCI期刊目录共包含3557本期刊。此次SCIE & SSCI期刊目录更新&#xff0c;与上次更新&#xff08;2023年4月&#xff09;相比&#xff…

NestedFormer:用于脑肿瘤分割的嵌套模态感知Transformer

文章目录 NestedFormer: Nested Modality-AwareTransformer for Brain Tumor Segmentation摘要方法Global Poolformer EncoderNested Modality-Aware Feature AggregationModality-Sensitive Gating 实验结果 NestedFormer: Nested Modality-AwareTransformer for Brain Tumor …

谈一谈CMDB

大家好&#xff0c;我是易安&#xff01;今天我们谈一谈运维相关的话题&#xff0c;配置管理&#xff0c;专业一点就叫作 CMDB&#xff08;Configuration Management DataBase&#xff09;。 概念 CMDB并不是一个新概念&#xff0c;它源于ITIL&#xff08;Information Technol…

大学毕业设计这样做可以吗

前言&#xff1a;相信看到这篇文章的小伙伴都或多或少有一些编程基础&#xff0c;懂得一些linux的基本命令了吧&#xff0c;本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python&#xff1a;一种编程语言&…

Evita中规定的安全汽车车载电子网络架构

摘要 文章目的 安全需求 安全架构 硬件和软件分区 EVITA硬件安全模块 ​编辑硬件接口 安全软件 部署 摘要和展望 REFERENCES 摘要 本文介绍了用于安全汽车车载网络的硬件和软件组件&#xff0c;为保护外部车辆通信提供基础。基于欧洲研究项目EVITA&#xff08;http://…

数据结构之初识树与堆

前言&#xff1a;前面学习了顺序表&#xff0c;队列&#xff0c;栈&#xff0c;链表&#xff0c;我们知道他们都是一种线性表&#xff0c;是一种线性结构&#xff0c;而除此之外&#xff0c;仍有许多我们还没认识的结构&#xff0c;比如树形结构&#xff0c;不同于线性结构&…

这个框架真心可以!10分钟就搞定一个网站!

最近有很多小伙伴问我&#xff1a;有没有能快速能搭建网站的框架。 首先我去尝试了低代码&#xff0c;快确实快&#xff0c;但是样式和功能确实差点意思。 偶然间&#xff0c;我发现一款神奇的网站框架:VuePress。 我尝试部署了下&#xff0c;然后一下爱上了它。我发现很多博…

百度飞桨语音PaddleSpeech在win上运行语音识别(ASR)与语音合成(TTS)

百度飞桨语音PaddleSpeech在win上运行语音识别(ASR)与语音合成(TTS) 前言 PaddleSpeech是PaddlePadle百度飞桨深度学习框架下的语音服务工具包。PaddleSpeech包括自监督学习模型、带标点符号的 SOTA/流式 ASR、带文本前端的流式 TTS、说话人验证系统、端到端语音翻译和关键字…

【Scala---01】Scala 基础 『 变量和数据类型 | 控制语句 | 函数式编程』

文章目录 1. 变量和数据类型1.1 变量和常量1.2 字符串1.3 数据类型1.4 伴生对象与伴生类1.5 代码块1.6 Unit、null、Nothing1.7 强制转换1.8 与 equals 2. 控制语句2.1 分支语句2.2 循环语句&#xff08;1&#xff09;for循环&#xff08;2&#xff09;while/do-while循环&…

QT客户端外包开发流程及难点

QT是一种跨平台的C应用程序开发框架&#xff0c;可以用于开发各种类型的客户端软件&#xff0c;包括桌面应用程序、移动应用程序、嵌入式应用程序等。在开发跨平台的客户端语言中&#xff0c;QT应该是应用最广泛的&#xff0c;今天和大家分享开发流程及技术难点&#xff0c;希望…

Consul系列:让服务Running in anywhere

引言 随着微服务概念深入人心&#xff0c;越来越多的解决方案选择使用微服务架构&#xff0c;这类架构的共同点是服务数量多&#xff0c;因此种类繁多的服务之间如何互相访问就变成了一个很现实的问 题。目前比较流行的分布式存储比如:Consul, etcd, ZooKeeper&#xff0c;如何…