Java集合自测题

文章目录

  • 一、说说 List , Set , Map 三者的区别?
  • 二、List , Set , Map 在 Java 中分别由哪些对应的实现类?底层的数据结构?
  • 三、有哪些集合是线程不安全的?怎么解决呢?
  • 四、HashMap 查询,删除的时间复杂度
  • 五、HashMap 的底层实现?
  • 六、HashMap 的⻓度为什么是 2 的幂次方
  • 七、比较 HashSet 、 LinkedHashSet 和 TreeSet 三者的异同
  • 八、HashMap 和 Hashtable 的区别? HashMap 和 HashSet 区别? HashMap 和 TreeMap 区别?ConcurrentHashMap 和 Hashtable 的区别?
  • 九、ConcurrentHashMap 线程安全的具体实现方式/底层具体实现


一、说说 List , Set , Map 三者的区别?

可以从这些数据结构中的元素是否有序、是否可以重复、存储的元素类型(⽐如 Map 存储的就是键值对)等⽅⾯来回答。

首先,就是LIst集合是单列集合,而Map集合是双列集合,也就是存储的是键值对。List集合通常是有序的,而Set集合和Map集合通常是无序的,同时,List集合里面的元素是可以重复的而Set集合里面的元素是不可重复的。Map集合中的键是可以不可重复的,而值是可以重复的。


二、List , Set , Map 在 Java 中分别由哪些对应的实现类?底层的数据结构?

提示:拿 List 来举例, List 的常⻅实现类以及它们的数据结构 :1、ArrayList : Object[] 数组 2、Vector : Object[] 数组 3、LinkedList : 双向链表(JDK1.6 之前为循环链表,JDK1.7 取消了循环)

首先说List集合,它的实现类有ArrayList、Vector、LinkedLIst,其中ArraList和Vector是由数组来实现的,而LinkedList而是由双向链表来实现的。然后再说Set集合,它的主要实现类是HashSet、LinkedHashSet和TreeSet,其中HashSet是基于HashMap实现的,LinkedHashSet是HashSet的子类,是通过LinkedHashMap来实现的。TreeSet是由红黑树实现的。


三、有哪些集合是线程不安全的?怎么解决呢?

提示:这块⽐较常问的是 Arraylist 和 Vector 、 HashMap 和 ConcurrentHashMap (⾼频问题,重要) 。被问到 Vector 的时候, 你紧接着可能会被问到 Arraylist 和 Vector 的区别。被问到 ConcurrentHashMap 的时候,你紧接着就可能会被问到 ConcurrentHashMap 相关的问题⽐如 ConcurrentHashMap 是如何保证线程安全的。

首先说单列集合里的ArrayList,它的线程是不安全的,双列集合Map里的HashMap是线程非安全的。而Vector是线程安全的,它们的区别在于线程是否安全,而Vector是远古实现类,现在基本不用了。ConcurrentHashMap是线程安全的,jdk1.8之前它是通过Segment 数组结构和 HashEntry 数组结构组成。通过给每一段加锁的方式来保证线程安全。而jdk1.8之后Node + CAS + synchronized来保证并发安全。
在这里插入图片描述

在这里插入图片描述

Java 8 中,锁粒度更细,synchronized 只锁定当前链表或红黑二叉树的首节点,这样只要 hash 不冲突,就不会产生并发,就不会影响其他 Node 的读写,效率大幅提升。


四、HashMap 查询,删除的时间复杂度

提示:1.没有哈希冲突的情况 2.转链表的情况 3.链表转红⿊树的情况

  1. 没有哈希冲突的情况

    • 时间复杂度:O(1)
    • 在理想情况下,如果没有哈希冲突,HashMap的查询和删除操作的时间复杂度是常数时间复杂度O(1),即平均情况下,它们的操作是非常快速的。
  2. 转链表的情况

    • 时间复杂度:O(n)
    • 当发生哈希冲突,即两个不同的键被映射到同一个桶(bucket)时,HashMap会在该桶上使用链表来存储这些键值对。在这种情况下,查询和删除操作的时间复杂度会退化为O(n),其中n是链表的长度。
  3. 链表转红黑树的情况

    • 时间复杂度:O(log n)
    • 为了避免链表过长导致性能下降,当链表长度达到一定阈值时,HashMap会将链表转换为红黑树(自平衡二叉搜索树)。在红黑树中,查询和删除操作的时间复杂度将变为O(log n),其中n是红黑树的节点数。

五、HashMap 的底层实现?

JDK1.8 之前 : 数组和链表、JDK1.8 之后 : 多了红⿊树

首先在jdk1.8之前,HashMap 底层是数组和链表结合在一起使用也就是链表散列。

JDK1.8 之后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8)(将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树)时,将链表转化为红黑树,以减少搜索时间。


六、HashMap 的⻓度为什么是 2 的幂次方

提示:提⾼运算效率。
为了能让 HashMap 存取高效,尽量较少碰撞,也就是要尽量把数据分配均匀。

取余(%)操作中如果除数是 2 的幂次则等价于与其除数减一的与(&)操作(也就是说 hash%length==hash&(length-1)的前提是 length 是 2 的 n 次方;)。并且 采用二进制位操作 &,相对于%能够提高运算效率,这就解释了 HashMap 的长度为什么是 2 的幂次方。


七、比较 HashSet 、 LinkedHashSet 和 TreeSet 三者的异同

提示:1.HashSet 、 LinkedHashSet 和 TreeSet 都是 Set 接⼝的实现类,都能保证元素唯⼀,并且都不是线程安全的。2.HashSet 、 LinkedHashSet 和 TreeSet 的主要区别在于底层数据结构不同(底层数据结构不同⼜导致这三者的应⽤场景不同)。

首先说一下他们的相同的点,他们都是Set接口的实现类,都能保证元素的唯一性,且都不还线程安全的。不同点在于由于他们的底层结构不同,导致它们的应用场景也不相同。具体而言HashSet 的底层数据结构是哈希表(基于 HashMap 实现)。LinkedHashSet 的底层数据结构是链表和哈希表,元素的插入和取出顺序满足 FIFO。TreeSet 底层数据结构是红黑树,元素是有序的,排序的方式有自然排序和定制排序。底层数据结构不同又导致这三者的应用场景不同。HashSet 用于不需要保证元素插入和取出顺序的场景,LinkedHashSet 用于保证元素的插入和取出顺序满足 FIFO 的场景,TreeSet 用于支持对元素自定义排序规则的场景。


八、HashMap 和 Hashtable 的区别? HashMap 和 HashSet 区别? HashMap 和 TreeMap 区别?ConcurrentHashMap 和 Hashtable 的区别?

提示:1.底层数据结构 2.实现线程安全的⽅式的区别.

首先HashMap与Hashtable相比,HashMap的底层实现是由数组加链表且链表会转化成红黑树(当链表的值大于8这个阈值,会先判断数组是否大于64,如果大于64则会将链表转化成红黑树,否则将数组扩容)实现。而hashtable则没有这个机制,而Hashmap是非线程安全的,而Hashtable是线程安全的。

HashMap与HashSet相比,首先他们的实现接口不一样HashMap实现Map接口,而HashSet实现Set接口,他们存储元素的结构不一样,HashMap存储的是键值对,而HashSet存储的是对象。它们计算hash的方式不一样,HashMap使用键来计算,而HashSet使用成员对象来计算,如果hashcode相同,则用equal()方法用来判断对象的相等性。

HashMap 和 TreeMap 相比,相比于HashMap来说, TreeMap 主要多了对集合中的元素根据键排序的能力以及对集合内元素的搜索的能力。


九、ConcurrentHashMap 线程安全的具体实现方式/底层具体实现

提示:JDK 1.7 : Segment 分段锁 JDK 1.8 : CAS 和 synchronized
ConcurrentHashMap 和 Hashtable 的区别主要体现在实现线程安全的方式上不同。

  • 底层数据结构: JDK1.7 的 ConcurrentHashMap 底层采用 分段的数组+链表 实现,JDK1.8 采用的数据结构跟 HashMap1.8 的结构一样,数组+链表/红黑二叉树。Hashtable 和 JDK1.8 之前的 HashMap 的底层数据结构类似都是采用 数组+链表 的形式,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的;

  • 实现线程安全的方式(重要):

    • 在 JDK1.7 的时候,ConcurrentHashMap 对整个桶数组进行了分割分段(Segment,分段锁),每一把锁只锁容器其中一部分数据(下面有示意图),多线程访问容器里不同数据段的数据,就不会存在锁竞争,提高并发访问率。
    • 到了 JDK1.8 的时候,ConcurrentHashMap 已经摒弃了 Segment 的概念,而是直接用 Node 数组+链表+红黑树的数据结构来实现,并发控制使用 synchronized 和 CAS 来操作。(JDK1.6 以后 synchronized 锁做了很多优化) 整个看起来就像是优化过且线程安全的 HashMap,虽然在 JDK1.8 中还能看到 Segment 的数据结构,但是已经简化了属性,只是为了兼容旧版本;
    • Hashtable(同一把锁) :使用 synchronized 来保证线程安全,效率非常低下。当一个线程访问同步方法时,其他线程也访问同步方法,可能会进入阻塞或轮询状态,如使用 put 添加元素,另一个线程不能使用 put 添加元素,也不能使用 get,竞争会越来越激烈效率越低。

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

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

相关文章

word怎么单页横向设置(页码不连续版)

打开word,将光标放在第一页的最后位置。 然后点击布局下的分隔符,选择下一页。 将光标放在第二页的开头,点击布局下的纸张方向,选择横向即可。 效果展示。 PS:如果那一页夹在两页中间,那么在…

Python发送Outlook邮件的步骤流程有哪些?

Python发送Outlook邮件的技巧?如何使用Python发信? 在Python中使用SMTP协议发送邮件到Outlook邮箱是一项常见的任务。AokSend将介绍如何通过Python编程语言实现这一过程,从准备工作到实际发送邮件的具体步骤。 Python发送Outlook邮件&#…

构建汛期智慧水利新生态:EasyCVR视频汇聚监控综合管理方案解析

一、项目背景与目标 随着我国水利事业的不断发展,水利设施的管理与维护工作愈发重要。随着夏季汛期的到来,水利管理工作面临着巨大的挑战。为确保水利设施的安全运行,及时应对可能出现的汛情,建设一套高效、智能的视频监控可视化…

wms海外仓系统排名分析:哪个才更适合中小海外仓

对中小型海外仓来说,想在竞争激烈的市场下生存,关键就在于是否能改变自己落后的仓储管理模式,提升客户满意度和业务流畅度。 wms海外仓系统作为这一领域的关键工具,可以说在很大程度上决定了海外仓的业务标准化程度发展。不过现在…

MFC为什么说文档在数据的保存和给用户提供数据之间划分了清晰的界限?

MFC MFC(Microsoft Foundation Classes)是微软为Windows应用程序开发提供的一套C类库,它在设计上强调了"文档-视图"(Document-View)架构。这种架构将文档(Document)与用户界面&#…

六西格玛培训都培训哪些内容 ?

天行健六西格玛培训的内容通常涵盖多个方面,旨在帮助学员全面理解和应用六西格玛管理方法。以下是详细的培训内容概述: 一、六西格玛基础知识 引入六西格玛的概念、原理和历史,包括DMAIC(定义、测量、分析、改进、控制&#xff0…

辗转相除法求最大公约数

辗转相除法求最大公约数 两个整数的最大公约数是能够同时整除它们的最大的正整数。辗转相除法基于如下原理:两个整数的最大公约数等于其中较小的数和两数相除余数的最大公约数。 点我跳转参考链接 算法实现: int gcd(int a, int b) {return b 0 ? a …

新需求:实现一个自动运维部署工具

如何构建一个高效、可靠的自动运维部署工具,以下是具体的需求情况,希望有朋友可以指点一下,有报酬的哦! 一、项目描述 本项目旨在构建一个端到端的自动化运维部署解决方案,整合SpringBoot后端服务、Vue3前端应用、Do…

方法分享 |公网IP怎么指定非433端口实现https访问

公网IP可以通过指定非443端口实现HTTPS访问。在网络配置中,虽然HTTPS协议默认使用443端口,但没有规定不能在其他端口上实施HTTPS服务。使用非标准端口进行HTTPS通信需要正确配置服务器和SSL证书,并确保客户端能够连接到指定的端口。下面说明如…

本地生活服务电商平台小程序源码系统 含完整的安装代码包+搭建教程

系统概述 本地生活服务电商平台小程序源码系统,是一款集成了商品展示、在线交易、服务预约、优惠券发放、会员管理、订单处理、即时通讯等多种功能于一体的综合性解决方案。它旨在为本地商家提供一个高效、便捷的线上经营平台,同时为消费者带来流畅的使…

⌈ 传知代码 ⌋ MonoCon解读与复现

💛前情提要💛 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间,对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…

uni-date-picker 禁用日期功能

在uni-datetime-picker组件中 calendar.vue <template><view class"uni-calendar" mouseleave"leaveCale"><view v-if"!insert && show" class"uni-calendar__mask" :class"{uni-calendar--mask-show:an…

在k8s中部署Logstash多节点示例(超详细讲解)

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《洞察之眼&#xff1a;ELK监控与可视化》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、Logstash简介 2、在K8s中部署Logstash多节点实例…

ubuntu的home内存不足的解决办法(win和ubuntu双系统)

这种解决办法前提是windows和ubuntu双系统 首先在windows系统上创建一个空的硬盘分区 然后在ubuntu系统上把这个空的硬盘放在主目录里 然后可以把东西存在这个文件夹中 如下图&#xff0c;但实际主目录的内存没有变&#xff0c;以后存东西就在这个文件夹里面就好了 具体操作…

git 大文本上传和下载git-lfs

1. ubuntu 1&#xff09;下载脚本来自动化配置系统上的包存储库&#xff0c;导入签名密钥等过程。这些脚本必须在root下运行。 # apt/deb repos: curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash # curl -s https://packag…

资源不是问题,极空间全自动小雅Alist以及Emby全家桶部署教程,同时实现自动更新

资源不是问题&#xff0c;极空间全自动小雅Alist以及Emby全家桶部署教程&#xff0c;同时实现自动更新 哈喽小伙伴&#xff0c;我是Stark-C~ 在上次更新了极空间虚拟机教程之后&#xff0c;终于有小伙伴催更了小雅Alist的搭建方案。作为当前市面最强、最大、最全的影视资源合…

基于springboot高校就业招聘系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;就业咨询管理&#xff0c;毕业去向管理&#xff0c;简历管理&#xff0c;管理员管理&#xff0c;基础数据管理 辅导员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;就业咨询管理…

uni-app文件下载 h5 xls 乱码 锟斤拷 Blob pdf打不开

原先下载方式&#xff0c;PC管理端和浏览器打开文件能下载&#xff0c;xls没出现乱码&#xff0c;pdf能正常显示,H5下载xls乱码锟斤拷&#xff0c;PDF显示空白内容 怀疑是前端问题&#xff0c;也尝试过修改后端代码 后端设置编码格式 response.setCharacterEncoding(characte…

人类如何挣脱被人工智能替代的命运?

人工智能技术的迭代升级&#xff0c;使得“换脸”“拟声”成为可能&#xff0c;我如何证明不是“我”&#xff1f;面对人工智能超高的生产效率&#xff0c;我如何与人工智能“抢工作”&#xff1f;在人工智能时代&#xff0c;如何回应这类疑问&#xff1f;挣脱被替代的命运&…

Java爬虫——正则表达式应用

Pattern Matcher均属于regex下 步骤&#xff1a;pattern获取正则&#xff0c;matcher获取文本对象&#xff0c;find截取字符串&#xff08;返回true、false&#xff09;&#xff0c;group获得字符 例题&#xff1a;爬取指定文字 分析&#xff1a; 二次调用时&#xff1a; 循环…