HashMap底层原理及各种问题(与HashTable、HashSet、ArrayMap的区别)

常见数据结构总结 ArrayList源码解析LinkedList源码解析CopyOnWriteArrayList源码解析HashMap源码解析ConcurrentHashMap源码解析TreeMap 和 LinkedHashMapHashSet 和 TreeSetAndroid中的Bundle,SparseArray和ArrayMap 阅读详情

这里借鉴了几篇写的不错的博客,值得学习:

https://blog.youkuaiyun.com/mbshqqb/article/details/79799009

https://blog.youkuaiyun.com/suifeng629/article/details/82179996

https://www.jianshu.com/p/45fa4e80b631

 

 

“你用过HashMap吗?” “什么是HashMap?你为什么用到它?”

固然是回答是的,然后列举一些特性,譬如HashMap可以接受null键值和值,而HashTable则不能;HashMap是非synchronized;HashMap很快;以及HashMap储存的是键值对等等。这显示出你已经用过HashMap,而且对它相当的熟悉。但是面试官来个急转直下,从此刻开始问出一些刁钻的问题,关于HashMap的更多基础的细节。

 

“你知道HashMap的工作原理吗?” “你知道HashMap的get()方法的工作原理吗?”

这里需要回答,HashMap是基于hashing的原理,我们使用put(key, value)存储对象到HashMap中,使用get(key)从HashMap中获取对象。当我们给put()方法传递键和值时,我们先对键调用hashCode()方法,返回的hashCode用于找到bucket位置来储存Entry对象。

这里关键点在于指出,HashMap是在bucket中储存键对象和值对象,作为Map.Entry。这一点有助于理解获取对象的逻辑。如果你没有意识到这一点,或者错误的认为仅仅只在bucket中存储值的话,你将不会回答如何从HashMap中获取对象的逻辑。这个答案相当的正确,也显示出面试者确实知道hashing以及HashMap的工作原理。但是这仅仅是故事的开始,当面试官加入一些Java程序员每天要碰到的实际场景的时候,错误的答案频现。

答案:

HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象。当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中。 HashMap在每个链表节点中储存键值对对象。

当两个不同的键对象的hashcode相同时, 它们会储存在同一个bucket位置的链表中。键对象的equals()方法用来找到键值对。

 

“当两个对象的hashcode相同会发生什么?”

一些面试者会回答因为hashcode相同,所以两个对象是相等的,HashMap将会抛出异常,或者不会存储它们。

然后面试官可能会提醒有equals()和hashCode()两个方法,并告诉我们两个对象就算hashcode相同,但是它们可能并不相等。一些面试者可能就此放弃,而另外一些还能继续挺进,他们回答“因为hashcode相同,所以它们的bucket位置相同,‘碰撞’会发生。因为HashMap使用LinkedList存储对象,这个Entry(包含有键值对的Map.Entry对象)会存储在LinkedList中。”这个答案非常的合理,虽然有很多种处理碰撞的方法,这种方法是最简单的,也正是HashMap的处理方法。

答案:

它们会储存在同一个bucket位置的LinkedList中。键对象的equals()方法用来找到键值对。

 

“如果两个键的hashcode相同,你如何获取值对象?”

当我们调用get()方法,HashMap会使用键对象的hashcode找到bucket位置,然后获取值对象。

面试官提醒如果有两个值对象储存在同一个bucket,给出答案:将会遍历LinkedList直到找到值对象。面试官会问因为你并没有值对象去比较,你是如何确定确定找到值对象的?除非面试者直到HashMap在LinkedList中存储的是键值对,否则不可能回答出这一题。

  其中一些记得这个重要知识点的面试者会说,找到bucket位置之后,会调用keys.equals()方法去找到LinkedList中正确的节点,最终找到要找的值对象。完美的答案!

  许多情况下,面试者会在这个环节中出错,因为他们混淆了hashCode()和equals()方法。因为在此之前hashCode()屡屡出现,而equals()方法仅仅在获取值对象的时候才出现。一些优秀的开发者会指出使用不可变的、声明作final的对象,并且采用合适的equals()和hashCode()方法的话,将会减少碰撞的发生,提高效率。不可变性使得能够缓存不同键的hashcode,这将提高整个获取对象的速度,使用String,Interger这样的wrapper类作为键是非常好的选择(原因后面会提及)。

 

以上为常规提问,那么下面这个就是送命题了。

“你了解重新调整HashMap大小存在什么问题吗?”

回答不上来,这时面试官会提醒你当多线程的情况下,可能产生条件竞争(race condition)。

当重新调整HashMap大小的时候,确实存在条件竞争,因为如果两个线程都发现HashMap需要重新调整大小了,它们会同时试着调整大小。在调整大小的过程中,存储在LinkedList中的元素的次序会反过来,因为移动到新的bucket位置的时候,HashMap并不会将元素放在LinkedList的尾部,而是放在头部,这是为了避免尾部遍历(tail traversing)。如果条件竞争发生了,那么就死循环了。这个时候,你可以质问面试官,为什么这么奇怪,要在多线程的环境下使用HashMap呢?(看到这里我忍不住笑了)

 

其他问题:

为什么String, Interger这样的wrapper类适合作为键? 

String, Interger这样的wrapper类作为HashMap的键是再适合不过了,而且String最为常用。因为String是不可变的,也是final的,而且已经重写了equals()和hashCode()方法了。其他的wrapper类也有这个特点。不可变性是必要的,因为为了要计算hashCode(),就要防止键值改变,如果键值在放入时和获取时返回不同的hashcode的话,那么就不能从HashMap中找到你想要的对象。

拓展:不可变性还有其他的优点如线程安全。如果你可以仅仅通过将某个field声明成final就能保证hashCode是不变的,那么请这么做吧。因为获取对象的时候要用到equals()和hashCode()方法,那么键对象正确的重写这两个方法是非常重要的。如果两个不相等的对象返回不同的hashcode的话,那么碰撞的几率就会小些,这样就能提高HashMap的性能。

 

我们可以使用自定义的对象作为键吗?

 这是前一个问题的延伸。当然你可能使用任何对象作为键,只要它遵守了equals()和hashCode()方法的定义规则,并且当对象插入到Map中之后将不会再改变了。如果这个自定义对象时不可变的,那么它已经满足了作为键的条件,因为当它创建之后就已经不能改变了。

 

我们可以使用CocurrentHashMap来代替HashTable吗?

这是另外一个很热门的面试题,因为ConcurrentHashMap越来越多人用了。

我们知道HashTable是synchronized的,但是ConcurrentHashMap同步性能更好,因为它仅仅根据同步级别对map的一部分进行上锁。ConcurrentHashMap当然可以代替HashTable,但是HashTable提供更强的线程安全性。

 

HashMap的长度:

HaspMap的默认初始长度是16,并且每次扩展长度或者手动初始化时,长度必须是2的次幂。之所以是16,是为了服务于从Key值映射到index的hash算法。前面说到了,从Key值映射到数组中所对应的位置需要用到一个hash函数:index = hash("Java");

 

初始长度为什么是16或者2的次幂?如果不是会怎么样?

这样符合Hash算法均匀分布的原则,效率会更高。

 

HashMap的死锁:

HashMap是非线程安全的,那么原因是什么呢?

由于HashMap的容量是有限的,如果HashMap中的数组的容量很小,假如只有2个,那么如果要放进10个keys的话,碰撞就会非常频繁,此时一个O(1)的查找算法,就变成了链表遍历,性能变成了O(n),这是Hash表的缺陷。

为了解决这个问题,HashMap设计了一个阈值,其值为容量的0.75,当HashMap所用容量超过了阈值后,就会自动扩充其容量。

在多线程的情况下,当重新调整HashMap大小的时候,就会存在条件竞争,因为如果两个线程都发现HashMap需要重新调整大小了,它们会同时试着调整大小。在调整大小的过程中,存储在链表中的元素的次序会反过来,因为移动到新的bucket位置的时候,HashMap并不会将元素放在链表的尾部,而是放在头部,这是为了避免尾部遍历。如果条件竞争发生了,那么就会产生死循环了。

具体可以去查:Java HashMap的死循环

 

什么是哈希冲突:

也就是说,当我们对某个元素进行哈希运算,得到一个存储地址,然后要进行插入的时候,发现已经被其他元素占用了,其实这就是所谓的哈希冲突,也叫哈希碰撞。

 

还有其他的问题诸如:

  • hashing的概念
  • HashMap中解决碰撞的方法
  • equals()和hashCode()的应用,以及它们在HashMap中的重要性
  • 不可变对象的好处
  • HashMap多线程的条件竞争
  • 重新调整HashMap的大小

 

与HashTable、HashSet的区别

 

HashMap和Hashtable的区别

HashMap和Hashtable都实现了Map接口,但决定用哪一个之前先要弄清楚它们之间的分别。主要的区别有:线程安全性,同步(synchronization),以及速度。

 

  • HashMap可存储null值,而Hashtable不可以

HashMap几乎可以等价于Hashtable,除了HashMap是非synchronized的,并可以接受null(HashMap可以接受为null的键值(key)和值(value),而Hashtable则不行)。

  • HashMap是非synchronized,而Hashtable是synchronized

这意味着Hashtable是线程安全的,多个线程可以共享一个Hashtable;而如果没有正确的同步的话,多个线程是不能共享HashMap的。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。

 

另一个区别是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以当有其它线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException,但迭代器本身的remove()方法移除元素则不会抛出ConcurrentModificationException异常。但这并不是一个一定发生的行为,要看JVM。这条同样也是Enumeration和Iterator的区别。

由于Hashtable是线程安全的也是synchronized,所以在单线程环境下它比HashMap要慢。如果你不需要同步,只需要单一线程,那么使用HashMap性能要好过Hashtable。

HashMap不能保证随着时间的推移Map中的元素次序是不变的。

注意:

1) sychronized意味着在一次仅有一个线程能够更改Hashtable。就是说任何线程要更新Hashtable时要首先获得同步锁,其它线程要等到同步锁被释放之后才能再次获得同步锁更新Hashtable。

2) Fail-safe和iterator迭代器相关。如果某个集合对象创建了Iterator或者ListIterator,然后其它的线程试图“结构上”更改集合对象,将会抛出ConcurrentModificationException异常。但其它线程可以通过set()方法更改集合对象是允许的,因为这并没有从“结构上”更改集合。但是假如已经从结构上进行了更改,再调用set()方法,将会抛出IllegalArgumentException异常。

3) 结构上的更改指的是删除或者插入一个元素,这样会影响到map的结构。

 

我们能否让HashMap同步?

HashMap可以通过下面的语句进行同步:

Map m = Collections.synchronizeMap(hashMap);

 

HashMap和HashSet的区别

HashMap和HashSet都是collection框架的一部分,它们让我们能够使用对象的集合。collection框架有自己的接口和实现,主要分为Set接口,List接口和Queue接口。它们有各自的特点,Set的集合里不允许对象有重复的值,List允许有重复,它对集合中的对象进行索引,Queue的工作原理是FCFS算法(First Come, First Serve)。

HashSet:实现了Set接口,它不允许集合中有重复的值,当我们提到HashSet时,第一件事情就是在将对象存储在HashSet之前,要先确保对象重写equals()和hashCode()方法,这样才能比较对象的值是否相等,以确保set中没有储存相等的对象。如果我们没有重写这两个方法,将会使用这个方法的默认实现。

public boolean add(Object o)方法用来在Set中添加元素,当元素值重复时则会立即返回false,如果成功添加的话会返回true。

HashMap:实现了Map接口,Map接口对键值对进行映射。Map中不允许重复的键。Map接口有两个基本的实现,HashMap和TreeMap。TreeMap保存了对象的排列次序,而HashMap则不能。HashMap允许键和值为null。HashMap是非synchronized的,但collection框架提供方法能保证HashMap synchronized,这样多个线程同时访问HashMap时,能保证只有一个线程更改Map。

public Object put(Object Key,Object value)方法用来将元素添加到map中。

 

区别:

  • HashMap实现了Map接口HashSet实现了Set接口
  • HashMap储存键值对HashSet仅仅存储对象
  • 使用put()方法将元素放入map中,使用add()方法将元素放入set中
  • HashMap中使用键对象来计算hashcode值HashSet使用成员对象来计算hashcode值,对于两个对象来说hashcode可能相同,所以equals()方法用来判断对象的相等性,如果两个对象不同的话,那么返回false
  • HashMap比较快,因为是使用唯一的键来获取对象HashSet较HashMap来说比较慢

 

HashMap和ArrayMap的区别

1、存储方式不同

HashMap内部有一个HashMapEntry<K, V>[]对象,每一个键值对都存储在这个对象里,当使用put方法添加键值对时,就会new一个HashMapEntry对象,

2、添加数据时扩容时的处理不一样

HasMap进行了new操作,重新创建对象,开销很大。ArrayMap用的是copy数据,所以效率相对要高。

3、ArrayMap提供了数组收缩的功能,在clear或remove后,会重新收缩数组,释放空间。

4、ArrayMap采用二分法查找。

WPF+Prism+LiveCharts+materialdesignin 搭建WPF开发框架 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容。 阅读详情

相关推荐

CentOS7环境下搭建 rsyslog 日志服务器,rsyslog+loganalyzer

1.系统环境部署 ip hostname 192.168.200.182 web 192.168.200.184 rsyslog-mysql 关闭防火墙、selinux、下载epel源 [root@web ~]# systemctl status firewalld.service ● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/f

sehn_的博客 3754

对HashMap的一些总结和思考

文章目录HashMap在jdk7中实现原理:HashMap在jdk8中相较于jdk7在底层实现方面的不同:1.HashMap集合-jdk82.HashMap集合底层的数据结构2.1数据结构2.2HashMap底层存储数据的过程3.HashMap继承关系4.HashMap集合类的成员4.1成员变量4.2构造方法4.3成员方法4.3.1增加方法 HashMap在jdk7中实现原理: HashMap map = new HashMap(): 在实例化以后,底层创建了长度是16的一维数组Entry[] table。

kk阿彬 2552

Ollama+FAISS+Embedding+Rerank+LLM 详细部署指南

下载安装Ollama 双击运行安装程序 安装完成后会自动启动服务 修改默认安装路径(避免C盘爆满) 或使用PowerShell: 验证安装 Linux系统部署: (二)准备模型 1. 拉取Embedding模型 2. 拉取LLM模型 注意:原文中提到的可能需要从自定义仓库拉取: 3. 下载Rerank模型 (三)安装依赖库 创建项目目录和虚拟环境: 二、主要功能实现 项目结构 (一)配置文件(config/config.yaml) (二)文本分块策略实现 创建 : (三)文档读取

AI技术改变世界 1576

HashMap 面试题 11 问,看这篇就够了

1、请你说说 HashMap 的数据结构有什么区别? jdk1.7 采用的是数组 + 链表结构: 在 jdk1.8 采用数组 + 链表 + 红黑树的结构: 2、上面说到 jdk1.8 之后增加了红黑树,什么 情况下转红黑树,什么情况下又转链表的? 1、当链表的长度达到 8 ,并且数组长度是否达到 64。如果达到 64,则进行链表转红黑树的操作。否则,只是发生一次 resize,散列表扩容,还有种情况,当数组很小,但是链表过长,首先扩容数组,而不是转换树。 2、当树中的元素经过删除或者其他原因调整了大小,

养歌的博客 6839

EB TRESOS 29.0.0安装教程用于MCAL配置开发

本文介绍的搭建基于NXP官网提供EB软件,进行基于标准AUTOSAR软件底层驱动配置的开发

qq_53260940的博客 1874

Paraview:Python Calculator Filter

python calculator过滤器 from paraview.simple import * connection = servermanager.Connect('localhost',11111) er = servermanager.sources.EnSightreader(CaseFileName='/.../data.case') er.PointArrays = ['x_velocity','1','y_velocity','1','z_velocity','1','cp','1']

haimianjie2012的专栏 3495

WeakHahMap,HashMap和(垃圾回收)Gc

1.HashMap的问题: public class testHashMap{ public static HashMap map; public static void main(String[] args){ addItem(); //下面如何得到放入HashMap的值 temp

daojin505的专栏 1128

MES系统领料申请、出库、确认到料各环节的处理

在WMS和MES系统协同的车间管理中,核心分工原则为:MES负责生产需求发起(领料申请)和结果确认(到料验收),WMS执行库存管理和物流作业。具体流程为:1)MES根据生产需求生成领料单推送至WMS;2)WMS完成拣货出库并调度AGV配送;3)车间在MES确认到料后解锁生产工序。系统边界严格限定:MES不参与库存/库位管理,WMS不干预生产决策。特殊场景(紧急补料、缺料异常等)通过标准化接口流程处理,确保生产与物流高效协同的同时保持账实一致。

做有价值的事,积累有价值的笔记! 583

hashMap解析

为什么hashMap不仅仅用数组一种数据结构? 因为数组虽然查询的时间复杂度为O1,但是数组有个缺陷就是不能动态改变大小,一旦超出数组长度,就需要创建一个新的数组,数组默认长度是16 链表是怎么插入的? java1.7采用头部插入法,后来的数据插入链表的头部,而1.8采用的时尾部插入法 红黑树 hashMap在扩容的时候遇到的问题? 在并发情况下,每个线程都同时申请扩容hashMap,这就造成声明多个数组,会导致内存溢出和频繁gc, ...

qq_38081917的博客 239

使用 SAP 自家的 AI 工具 Joule 辅助 SAP Fiori 应用开发

SAP Joule 不请自答,解释说标记了接口的 UI Component,具备进行异步内容创建的能力,比如其通过 rootView 分配的视图,在运行时可以异步创建。目前 SAP Business Application Studio 里的 SAP Joule 支持下面这八种上下文,绝大部分都和 SAP UI5 开发相关,剩下的则是代码仓库和 SAP 帮助文档的搜索。SAP Joule 回答的大意是:我只负责回答 SAP UI5 开发相关的问题,不要和我扯其他有的没的。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1093

YOLO26涨点改进 | 检测头改进篇 | 利用ASFF改进YOLO26检测头,自适应空间特征融合模块,在所有的目标检测上均有大幅度的涨点效果

本文提出了一种自适应空间特征融合(ASFF)检测头YOLO26,用于解决目标检测中特征金字塔跨尺度特征不一致的问题。ASFF通过学习空间权重图,自适应地融合不同尺度的特征,抑制特征层间的冲突信息。实验表明,该方法在MSCOCO数据集上显著提升了检测精度(45FPS下AP达42.4%),且仅引入极小推理开销。ASFF模块具有可微分性、模型无关性和计算成本低等优势,能够有效改善特征尺度不变性,实现速度与精度的良好平衡。文章详细介绍了ASFF的原理、实现代码及其在YOLO模型中的集成方法。

Ai缝合怪、助力小伙伴高效发论文 549

Java之HashMap源码分析(第三篇:删除元素)

0、JDK1.8中,HashMap中删除的元素的办法有很多,有自己的,也有迭代器的 1、这是最常用的 public V remove(Object key) { Node<K,V> e; return (e = removeNode(hash(key), key, null, false, true)) == null ? ...

王员外的博客 1609

【STK】手把手教你利用STK进行仿真-STK软件简介02 STK专业分析模块

STK/Astrogator是一个交互式轨道机动和深空探测计划工具,用于飞行器运行及任务分析,通过定义推力模型、目标星历、飞行器姿态,提供轨道机动的解决及优化方案。应用Astrogator分析轨道机动的可见性和地面站覆盖,用户可以快速、方便地进行全局分析。任务控制序列保存在STK场景中,用于任务运行、快速制定精确轨道机动方案。为在轨运行的飞行器制定或执行机动计划时,分析人员可以根据飞行过程数据,如发动机定标参数、实际初始轨道,计算出推进器点火和点火时机数据,用于发出指令及精炼机动计划。

weixin_44184852的博客 1864

浅谈Java数据结构中的常见问题

1、常用数据结构 数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素间的关系组成。常用的数据有:数组、栈、队列、链表、树、图、堆、散列表。 1)数组:在内存中连续存储多个元素的结构。数组元素通过下标访问,下标从0开始。优点:访问速度快;缺点:数组大小固定后无法扩容,只能存储一种类型的数据,添加删除操作慢。适用场景:适用于需频繁查找,对存储空间要求不高,很少添加删除。 2)...

门心叼龙的专栏 1万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

数据结构面试专题详解,收藏一下吧(2)

最后这里放上我这段时间复习的资料,这个资料也是偶然一位朋友分享给我的,里面包含了腾讯、字节跳动、阿里、百度2019-2021面试真题解析,并且把每个技术点整理成了视频和PDF(知识脉络 + 诸多细节)。还有高级架构技术进阶脑图、高级进阶架构资料帮助大家学习提升进阶,也可以分享给身边好友一起学习。一起互勉~《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!)][外链图片转存中…(img-7yyadScp-1715327218422)]一起互勉~

2401_84003941的博客 729

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

数据结构面试专题详解,收藏一下吧

如果table[index]处不为空,说明发生了hash冲突,判断table[index]处结点是否是TreeNode(红黑树结点)类型数据,如果是则执行putTreeVal方法,按红黑树规则将键值对存入;如果table[index]是链表形式,遍历该链表上的数据,将该键值对放在table[index]处,并将其指向原index处的链表。判断链表上的结点数是否大于链表最大结点限制(默认为8),如果超过了需执行treeifyBin()操作,则要将该链表转换成红黑树结构。

2401_84049282的博客 407

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

hashset java 键值对_浅谈Java数据结构中的常见问题

1、常用数据结构数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素间的关系组成。常用的数据有:数组、栈、队列、链表、树、图、堆、散列表。1)数组:在内存中连续存储多个元素的结构。数组元素通过下标访问,下标从0开始。优点:访问速度快;缺点:数组大小固定后无法扩容,只能存储一种类型的数据,添加删除操作慢。适用场景:适用于需频繁查找,对存储空间要求不高,很少添加删除。2)栈:一种...

weixin_40001025的博客 393

数据结构面试专题详解,收藏一下吧(3)

Android学习PDF+架构视频+源码笔记高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料这几块的内容。非常适合近期有面试和想在技术道路上继续精进的朋友。网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。需要这份系统化学习资料的朋友,可以戳这里获取一个人可以走的很快,但一群人才能走的更远!

2401_84537646的博客 312

数据结构与算法总结

(一) 数据结构 列举java的集合以及集合之间的继承关系: 容器类介绍以及之间的区别(Java容器主要可以划分为4个部分:List列表、Set集合、Map映射、工具类(Iterator迭代器、Enumeration枚举类、Arrays和Collections)) List,Set,Map的区别:List能插入重复对象,可插入多个Null元素;Set不允许有重复对象,能有一个Null元素,set是无序的,但TreeSet 能进行排序;Map是一个接口,并不是collection的子接口或实现类,ke.

风和先行的专栏 296

Java集合数据结构

1、HashMap的实现原理、HashMap的数据结构、HashMap的源码理解、从HashMap源码角度说说怎么put数据、HashMap怎么解决hash冲突的。 extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable // 初始容量 16 // 最大容量 2^30 // 加载因子 0.75 // 扩容倍数 2 // 临界值 = 容量 * 加载因子 默认临界值为12 // 最大临界值

鱼获飞的博客 402

2024至2024年Android开发面试习题整理,持续更新中

3、列举java的集合以及集合之间的继承关系略4、容器类介绍以及之间的区别1)Collection接口:集合框架的根接口,它是集合类框架中最具一般性的顶层接口。2)Map接口:提供了键值对的映射关系的集合,关键字不能有重复值,每个关键字至多可映射一个值。HashMap(通过散列机制,用于快速访问),TreeMap(保持key处于排序状态,访问速度不如hashmap), LinkedHashMap(保持元素的插入顺序)

2401_87029538的博客 1418

java集合简要分析

本文分析了Map的实现类:HashMap,Hashtable,LinkedHashMap和Android中特有的ArrayMap和SparseArray。以及分析Set的子类HashSet和TreeSet,List的子类ArrayList和LinkedList的数据存储方式和特点。

hwliu51的笔记 496

2020至2021年Android开发面试习题整理,持续更新中

接口和抽象类都遵循”面向接口而不是实现编码”设计原则,它可以增加代码的灵活性,可以适应不断变化的需求。下面有几个点可以帮助你回答这个问题:在Java中,你只能继承一个类,但可以实现多个接口。所以一旦你继承了一个类,你就失去了继承其他类的机会了。

2501_90359044的博客 485

Android面试必考:Java基础核心原理与高频避坑指南

Java内存模型(JMM)定义了多线程环境下共享变量的访问规则,是理解并发编程的基石。其核心原理涉及主内存与工作内存的交互,通过volatile关键字的内存屏障指令保证可见性与有序性,而synchronized则通过锁升级机制(偏向锁、轻量级锁、重量级锁)实现线程同步。这些机制的技术价值在于为高并发、高性能应用提供底层支持,尤其在Android开发中,深刻理解JMM和锁机制能有效避免内存泄漏、ANR等性能问题。应用场景广泛,从UI线程安全到后台任务处理,都离不开对Java并发基础的掌握。本文聚焦Androi

weixin_30595035的博客 310

2020Android常见面试题,我就不信你还听不明白了

4、什么是内部类?内部类的作用 内部类可直接访问外部类的属性 Java中内部类主要分为成员内部类、局部内部类(嵌套在方法和作用域内)、匿名内部类(没构造方法)、静态内部类(static修饰的类,不能使用任何外围类的非static成员变量和方法, 不依赖外围类) 5、进程和线程的区别 进程是cpu资源分配的最小单位,线程是cpu调度的最小单位。 进程之间不能共享资源,而线程共享所在进程的地址空间和其它资源。 一个进程内可拥有多个线程,进程可开启进程,也可开启线程。 一个线程只能属于一个进程,线程可直接使用同进

m0_63737583的博客 357
上一篇: 重写equals()方法的注意事项及其原因,为什么重写equals()时需要hashCode()方法?
下一篇: 结合代码!Android常见的设计模式(持续更新)
Nobody_else_
博客等级 码龄10年 51粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值