Map面试题及答案(贴近实战版).docx

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

Map面试题及答案(贴近实战版)

一、基础理解题

Map接口和Collection接口的核心区别是什么?实际开发中怎么选?

答:核心是存储结构——Map是键值对(key-value)存储,通过key快速定位value;Collection是单元素集合(如List、Set),存储单个对象。

实际选的时候:如果需要“通过唯一标识查数据”(比如存用户ID-用户信息),用Map;如果只是“存一堆同类型数据”(比如存所有商品名称),用Collection。

HashMap的key和value能存null吗?Hashtable呢?为什么?

答:HashMap的key可以存1个null,value可以存多个null;Hashtable的key和value都不能存null,存了会抛NullPointerException。

原因是Hashtable是早期线程安全类,源码里会主动检查key/value是否为null(比如put方法里有if(value==null)thrownewNullPointerException());而HashMap没这个检查,但key为null时会固定存在哈希表的第0个位置。

TreeMap和HashMap的排序特性有啥不一样?什么时候用TreeMap?

答:HashMap是无序的(存储顺序和插入顺序无关);TreeMap会按key的自然顺序(比如Integer升序、String字典序)或自定义比较器排序。

比如需要“按用户年龄升序存用户信息”(key是年龄),或者“按字符串长度排序存数据”,就用TreeMap。

二、进阶原理题

HashMap底层怎么解决哈希冲突的?JDK1.8之后有啥优化?

答:哈希冲突是指不同key计算出相同的哈希值,底层用链地址法解决——把哈希值相同的元素存在同一个链表(或红黑树)里。

JDK1.8的优化:原本冲突元素只存在链表,当链表长度超过8,且哈希表容量≥64时,会把链表转成红黑树;当元素减少到≤6时,又会转回链表。这样做是因为链表查元素是O(n),红黑树是O(logn),大数据量时更快。

HashMap的负载因子为啥默认是0.75?调大或调小有啥影响?

答:负载因子(loadFactor)是“哈希表满的程度”的阈值,公式是:扩容阈值=容量×负载因子。

选0.75是时间和空间的平衡:如果调大(比如1.0),哈希表更满,省内存,但冲突概率会变高,查询变慢;如果调小(比如0.5),冲突少,查询快,但会频繁扩容,浪费内存(比如容量16,阈值8就扩容,一半空间没用)。

ConcurrentHashMap是怎么保证线程安全的?和Hashtable的线程安全方式有啥区别?

答:JDK1.8的ConcurrentHashMap用CAS+synchronized保证安全——它把哈希表分成多个“段”(Node数组),加锁时只锁当前元素所在的段(或链表/红黑树的头节点),不是锁整个表,所以支持多线程并发操作。

Hashtable是用synchronized修饰方法(比如put、get都加了synchronized),相当于锁整个表,多线程同时操作时会排队,效率低。所以实际开发中,多线程场景优先用ConcurrentHashMap,不用Hashtable。

三、实战场景题

项目里用HashMap存数据,遍历的时候想删除某个元素,直接用for循环删会出问题吗?怎么解决?

答:会出ConcurrentModificationException(并发修改异常)。因为HashMap的迭代器有“快速失败”机制,遍历过程中如果修改了集合大小(比如remove),会检查modCount(修改次数)和expectedModCount(预期修改次数)是否一致,不一致就抛异常。

解决办法:①用迭代器的remove()方法(比如IteratorMap.EntryK,Vit=map.entrySet().iterator();while(it.hasNext()){Entryentry=it.next();if(条件)it.remove();});②用JDK8的stream过滤(map.entrySet().removeIf(entry-条件))。

如果用自定义对象当HashMap的key,需要注意什么?不然会出现什么问题?

答:必须重写hashCode()和equals()方法,而且要保证“equals相

文档评论(0)

151****9429 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档