面试题 —— Java集合篇(23题)
文章目录
- 1.Java中常见集合有哪些 ?
- 2. 说说你对Java集合是怎么理解的?
- 3.请你说一下List,Set,Map三者的特点是 ?
- 4.在实际开发过程中如何更好的选择集合 ?
- 5. ArrayList和Vector区别 ?
- 6. ArrayList和LinkedList之间的区别是什么?
- 7.HashSet和TreeSet的区别是什么?
- 8. HashMap和Hashtable之间的区别是什么?
- 9.什么是迭代器(Iterator)?它的作用是什么?
- 10.如何在Java中创建不可变集合?
- 11.如何遍历一个Map?
- 12.CopyOnWriteArrayList是什么 ?
- 13.List的遍历例方式该如何选择?
- 14.ArrayList的扩容机制?
- 15.CopyOnWriteArrayList有啥缺点 ?
- 16.CopyOnWriteArrayList的实现原理是什么 ?
- 17.CopyOnWriteArrayList为什么并发安全且性能比Vector好 ?
- 18.HashSet是如何检查重复的 ?
- 19.ConcurrentHashMap特点和底层原理?
- 20.如何将数组转换为List?
- 21.HashSet和LinkedHashSet内部有什么区别?
- 22.如何在集合中查找元素是否存在?
- 23.线程安全的集合有哪些?他们的底层实现?
1.Java中常见集合有哪些 ?
- Collection
- List :支持有序、可重复的元素,ArrayList、LinkedList、Vector。
- Set:不允许重复元素,常用实现类有 HashSet、LinkedHashSet、TreeSet。
- Queue:
- Deque :
- Map
- Map:HashMap、LinkedHashMap、TreeMap
- HashTable:类似于 HashMap,但是是线程安全的,不推荐使用,可以使用 ConcurrentHashMap 代替。
2. 说说你对Java集合是怎么理解的?
Java集合是一组用于存储和操作数据的类和接口的集合。它们是Java编程中非常重要的一部分,用于管理和组织数据,提供了各种数据结构和算法,以满足不同类型的数据存储和检索需求。以下是我对Java集合的理解:
-
数据存储和组织:Java集合用于存储和组织数据,可以存储不同类型的数据,包括基本数据类型和对象。它们提供了各种数据结构,如列表(List)、集合(Set)、映射(Map)等,以满足不同的数据组织需求。
-
动态大小:Java集合通常具有动态大小,可以根据需要自动扩展或缩小。这使得它们非常灵活,可以适应不同数量的数据。
-
类型安全:Java集合是类型安全的,这意味着它们可以在编译时检查数据类型,从而减少运行时错误。
-
高性能:Java集合类经过优化,提供了高性能的数据访问和操作方法,以确保在大规模数据集上的效率。
-
迭代和遍历:Java集合提供了方便的迭代和遍历机制,可以轻松地访问集合中的元素。
-
多线程支持:Java集合包括线程安全的实现,例如ConcurrentHashMap,以支持多线程环境中的并发访问。
-
丰富的功能:Java集合提供了丰富的功能,包括排序、查找、过滤、映射等操作,以满足各种数据处理需求。
-
常见集合类:Java中一些常见的集合类包括ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeMap等。每个集合类都有其独特的特点和适用场景。
泛型支持:Java集合框架使用泛型来增强类型安全性,允许您在编译时指定集合中存储的元素类型。
3.请你说一下List,Set,Map三者的特点是 ?
- List(列表):
- 有序性:List是有序集合,它按照元素的插入顺序来维护元素。
- 可重复性:List允许存储重复元素,同一个元素可以多次出现。
- 访问元素:可以通过索引(位置)来访问和操作List中的元素,支持随机访问。
- 常见实现类:ArrayList,LinkedList,Vector等。
- Set(集合):
- 无序性:Set是无序集合,它不维护元素的特定顺序。
- 唯一性:Set不允许存储重复元素,每个元素在Set中只能出现一次。
- 不支持索引:Set不支持通过索引访问元素,因为元素没有特定的位置。
- 常见实现类:HashSet,LinkedHashSet,TreeSet等。
- Map(映射):
- 键-值对:Map是键值对的集合,每个元素都包含一个唯一的键和与之相关联的值。
- 键的唯一性:Map中的键是唯一的,同一个键不能对应多个值。
- 通过键访问:可以通过键来访问和操作Map中的值,而不是通过位置。
- 常见实现类:HashMap,LinkedHashMap,TreeMap,HashTable等。
4.在实际开发过程中如何更好的选择集合 ?
-
了解需求:首先,明确你的需求。了解你需要存储的数据类型、数据量、访问模式(读多写少、读写均衡、多线程访问等)以及对数据的操作需求(搜索、排序、迭代等)是选择集合的关键。
-
有序性需求:
如果你需要维护元素的揺序,可以选择List。
如果元素的顺序无关紧要,可以选择Set或Map。 -
元素唯一性需求:
如果需要确保元素的唯一性,选择Set。
如果需要建立键到值的映射关系,选择Map。 -
数据量和性能:
对于小数据量和不需要高性能的场景,通常选择任何一种集合都可以。
对于大数据集,需要根据性能需求选择合适的数据结构,例如使用HashSet而不是ArrayList来避免重复数据的存储。
如果需要高性能的并发访问,可以考虑使用Concurrent集合(如ConcurrentHashMap)。 -
操作需求:
如果需要频繁地进行插入和删除操作,考虑使用LinkedList或LinkedHashSet,因为它们在这些操作上更高效。
如果需要快速的随机访问元素,使用ArrayList或HashMap。 -
线程安全性:
如果在多线程环境下访问集合,确保选择线程安全的集合类或考虑在操作上加锁以避免竞态条件。 -
内存占用:
考虑集合的内存占用,选择合适的数据结构以最小化内存使用。 -
对比不同集合实现:
Java提供了多种集合实现,例如ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeMap等。仔细对比它们的性能和特性,选择最适合你需求的实现类。
使用泛型:尽量使用泛型来指定集合中存储的元素类型,以增强类型安全性。 -
考虑第三方库:有时候,第三方库中可能有更适合特定需求的集合实现,可以考虑使用这些库。
5. ArrayList和Vector区别 ?
- 初始容量:
1. ArrayList初始默认容量为0;添加第一个元素时,扩容为10;
2. Vector初始默认容量为10; - 扩容方式:
1. ArrayList在原有容量基础上扩容0.5倍;
2. Vector在原有容量基础上,扩容1倍; - 线程安全:
1. ArrayList是线程不安全的;
2. Vector是线程安全的; - 执行效率:
1.Vector的方法都是由同步锁的,在方法执行期间需要加锁,解锁,所以性能会低于ArrayList。
6. ArrayList和LinkedList之间的区别是什么?
- 底层数据结构:ArrayList底层使用的是Object数组,LinkedList底层使用的是双向链表(JDK1.6之前为循环链表,JDK1.7取消了循环);
- 插入和删除元素: ArrayList采用数组存储,插入删除时需要移动元素,所以性能较差,LinkedList采用链表存储,性能比较高;
- 往集合中间插入数据时ArrayList比linkedList慢
- ArrayList正好扩容的时候添加数据要比LinkedList慢
- ArrayList要比LinkedList慢,原理同往集合中间插入数据一样,ArrayList每次删除数据都要对数组重组;
- 查询数据:
- ArrayList比LinkedList快;ArrayList是数组有下标标记数据位置的,查询时世界返回对应数组下表数据即可
7.HashSet和TreeSet的区别是什么?
-
底层数据结构:HashSet使用哈希表作为底层数据结构,而TreeSet使用红黑树作为底层数据结构。
-
元素的排序方式:HashSet中的元素是无序的,而TreeSet中的元素是有序的,且默认按照元素的自然顺序排序。如果需要按照其他方式排序,则需要在创建TreeSet时指定一个Comparator对象。
-
元素的唯一性:HashSet中的元素是唯一的,不允许重复,而TreeSet中的元素也是唯一的,但是它是通过比较器或元素的自然顺序来判断元素是否相同的。
-
性能:HashSet的插入、删除和查找操作的时间复杂度都是O(1),而TreeSet的这些操作的时间复杂度都是O(log n)。
因此,如果需要快速的插入、删除和查找操作,并且不需要元素有序,则可以选择HashSet。如果需要元素有序,或者需要按照其他方式进行排序,则可以选择TreeSet。
8. HashMap和Hashtable之间的区别是什么?
- 线程安全性:
HashMap:HashMap 不是线程安全的。多个线程可以同时访问和修改一个 HashMap 实例,这可能导致并发问题,需要额外的同步措施来确保线程安全。
Hashtable:Hashtable 是线程安全的。它的方法是同步的,因此多个线程可以安全地访问和修改一个 Hashtable 实例。然而,这种同步可能会导致性能下降,因此在不需要线程安全性的情况下,推荐使用 HashMap。 - null 键和值:
HashMap:HashMap 允许键和值都为 null。
Hashtable:Hashtable 不允许键或值为 null。如果尝试将 null 放入 Hashtable,将引发 NullPointerException。 - 遍历方式:
HashMap:HashMap 不保证元素的顺序,遍历的顺序不一定与元素插入的顺序一致。
Hashtable:Hashtable 不保证元素的顺序,遍历的顺序也不一定与元素插入的顺序一致。 - 继承关系:
HashMap:HashMap 继承自 AbstractMap 类,实现了 Map 接口。
Hashtable:Hashtable 继承自 Dictionary 类,实现了 Map 接口的旧版本,不建议在新代码中使用。
9.什么是迭代器(Iterator)?它的作用是什么?
迭代器是一种用于遍历集合元素的对象,它提供了一种统一的方式来访问集合中的元素,而不需要了解集合的内部结构。
10.如何在Java中创建不可变集合?
使用Collections.unmodifiableXXX方法(如unmodifiableList、unmodifiableSet)可以创建不可变集合。
11.如何遍历一个Map?
- 使用for循环遍历map;
- 使用迭代器遍历map;
- 使用keySet迭代遍历map;
- 使用entrySet遍历map。
12.CopyOnWriteArrayList是什么 ?
13.List的遍历例方式该如何选择?
14.ArrayList的扩容机制?
ArrayList 是一个数组结构的存储容器,默认情况下,设置数组长度是 10. 当然我们也可以在构建 ArrayList 对象的时候自己指定初始长度。 随着在程序里面不断的往 ArrayList 中添加数据,当添加的数据达到 10 个的时候, ArrayList 就没有多余容量可以存储后续的数据。 这个时候 ArrayList 会自动触发扩容。 扩容的具体流程很简单:
- 首先,创建一个新的数组,这个新数组的长度是原来数组长度的 1.5 倍。
- 然后使用 Arrays.copyOf 方法把老数组里面的数据拷贝到新的数组里面。 扩容完成后再把当前要添加的元素加入到新的数组里面,从而完成动态扩容的过程。
扩容时机:扩容,当添加元素时,如果元素个数+1> 当前数组长度 【size + 1 > elementData.length】时
15.CopyOnWriteArrayList有啥缺点 ?
-
内存占用:如果 CopyOnWriteArrayList经常要增删改集合中的数据,执行add(),set(),remove()方法,每次都需要复制一个新数组,比较耗费内存;
-
数据一致性:CopyOnWrite容器只能保证数据的最终一致性,不能保证数据的实时一致性,因为增删改操作的是新数组,读取操作的是原数组。
16.CopyOnWriteArrayList的实现原理是什么 ?
- CopyOnWriteArrayList的所有修改操作的底层原理都是通过创建数组的新副本来实现。
- 当CopyOnWriteArrayList需要被修改的时候,并不修改原有内容,而是对原有数据进行一次性复制,将修改的内容写入新的副本中,然后再将修改
17.CopyOnWriteArrayList为什么并发安全且性能比Vector好 ?
- Vector是增删改查方法都加了synchronized,保证同步,但是每个方法执行的时候都要去获取锁,性能就会大大降低;
- 而CopyOnWriteArrayList 只是在增删改上加锁,但是读不加锁,在读方面的性能就好于Vector,CopyOnWriteArrayList支持读多写少的并发情况。读写分离,写时复制出一个新的数组,完成插入、修改或者移除操作后将新数组赋值给array。
18.HashSet是如何检查重复的 ?
1.当对象加入HashSet时,HashSet会先计算对象的hashCode值来判断对象将要添加的位置,如果该位置没有其他元素,则代表不重复;
2.如果该位置存在其他元素,会比较该位置链表内的其他元素的hashCode值,如果没有相同的hashCode,代表不重复;
3.如果发现有相同的hashCode,接下来会调用equals()方法来检查这两个元素是否相同,如果equals()比较的结果是true,代表重复,否则代表不重复。
19.ConcurrentHashMap特点和底层原理?
20.如何将数组转换为List?
使用Arrays.asList(T… a)方法可以将数组转换为List。
21.HashSet和LinkedHashSet内部有什么区别?
22.如何在集合中查找元素是否存在?
使用contains(Object obj)方法可以检查集合中是否包含指定的元素。
23.线程安全的集合有哪些?他们的底层实现?
线程安全的集合有Vector、HashTable、Stack、ArrayBlockingQueue、ConcurrentHashMap、ConcurrentLinkedQueue等。
相关文章:
面试题 —— Java集合篇(23题)
文章目录 1.Java中常见集合有哪些 ?2. 说说你对Java集合是怎么理解的?3.请你说一下List,Set,Map三者的特点是 ?4.在实际开发过程中如何更好的选择集合 ?5. ArrayList和Vector区别 ?6. ArrayList…...
SpringBoot2.7.14整合Swagger3.0的详细步骤及容易踩坑的地方
🧑💻作者名称:DaenCode 🎤作者简介:啥技术都喜欢捣鼓捣鼓,喜欢分享技术、经验、生活。 😎人生感悟:尝尽人生百味,方知世间冷暖。 📖所属专栏:Sp…...
题解:ABC321D - Set Menu
题解:ABC321D - Set Menu 题目 链接:Atcoder。 链接:洛谷。 难度 算法难度:B。 思维难度:C。 调码难度:B。 综合评价:见洛谷链接。 算法 枚举二分查找。 思路 先对b升序排序&#x…...
什么是Progressive Web App(PWA)?它们有哪些特点?
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 渐进式Web App简介⭐ PWAs的主要特点⭐ 总结⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入…...
MySQL的高级SQL语句
目录 一、高级SQL语句 1、select 查询表中一个或多个字段的数据 2、distinct 不显示重复的数据记录 3、where 有条件查询 4、and与or 且与或 5、in 显示在某个范围值内 的字段的信息 6、between 显示两个值范围内的数据记录 7、order by 对字…...
基于人脸5个关键点的人脸对齐(人脸纠正)
摘要:人脸检测模型输出人脸目标框坐标和5个人脸关键点,在进行人脸比对前,需要对检测得到的人脸框进行对齐(纠正),本文将通过5个人脸关键点信息对人脸就行对齐(纠正)。 一、输入图像…...
vue3中两个el-select下拉框选项相互影响
vue3中两个el-select下拉框选项相互影响 1、开发需求2、代码2.1 定义hooks文件2.2 在组件中使用 1、开发需求 如图所示,在项目开发过程中,遇到这样一个需求,常规时段中选中的月份在高峰时段中是禁止选择的状态,反之亦然。 2、代…...
博弈论——反应函数
反应函数 1 引言 谢老师的《经济博弈论》书中对反应函数并没有给出一般笼统的定义,而是将其应用与古诺模型并给出了相关解释:反应函数是指在无限策略的古诺博弈模型中,博弈方的策略有无限多种,因此各个博弈方的最佳对策也有无限…...
UE5读取json文件
一、下载插件 在工程中启用 二、定义读取外部json文件的函数,参考我之前的文章 ue5读取外部文件_艺菲的博客-CSDN博客 三、读取文件并解析为json对象 这里Load Text就是自己定义的函数,ResourceBundle为一个字符串常量,通常是读取的文件夹…...
Vue中的插槽--组件复用,内容自定义
插槽 文章目录 插槽插槽-默认插槽插槽-后备内容(设置默认值)插槽-具名插槽插槽–作用域插槽 插槽-默认插槽 作用:让组件内部的一些结构支持自定义 需求:要在页面中显示一个对话框,封装成一个组件(对话框有很多功能是类…...
完全指南:mv命令用法、示例和注意事项 | Linux文件移动与重命名
文章目录 mv命令使用指南1. 简介什么是mv命令?mv命令的作用和功能是什么? 2. 基本用法基本语法格式如何移动文件?如何重命名文件?如何移动和重命名目录? 3. 高级用法使用通配符进行批量移动和重命名使用选项进行文件移…...
gitee生成公钥和远程仓库与本地仓库使用验证
参考文档: https://help.gitee.com/base/account/SSH%E5%85%AC%E9%92%A5%E8%AE%BE%E7%BD%AE(1)通过命令ssh-keygen 生成SSH key -t key类型 -c注释 ssh-keygen -t ed25519 -C "Gitee SSH Key" (2)按三次回车 (3)查看生成的 SSH 公钥和私钥: …...
请求后端接口413
当在进行HTTP请求时出现"413 Request Entity Too Large"错误时,通常是因为请求体的大小超过了服务器的配置限制。这个错误提示表明服务器拒绝接受过大的请求。 此时一般还未到后端服务,是被后端的ngnix代理服务器拦截的,所以可以检…...
HarmonyOS之 开发环境搭建
一 鸿蒙简介: 1.1 HarmonyOS是华为自研的一款分布式操作系统,兼容Android,但又区别Android,不仅仅定位于手机系统。更侧重于万物物联和智能终端,目前已更新到4.0版本。 1.2 HarmonyOS软件编程语言是ArkTS,…...
QTC++ day12
注册登录界面 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QIcon> #include <QPushButton> #include <QLineEdit> #include <QLabel> #include <QDebug> #include <QMessageBox>//消息对话框类 #inc…...
Vue3中使用Proxy API取代defineProperty API的原因
目录 一、前言 二、defineProperty API的限制和问题 三、Proxy API的优势和特性 四、Vue3.0中使用Proxy API的原因 五、Proxy API的局限性和注意事项 一、前言 Vue3.0是Vue.js框架的最新版本,它在底层进行了许多重要的改进。其中最引人注目的变化之一是它转而…...
构建工具Webpack简介
一、构建工具 当我们习惯了Node中使用ES模块化编写代码以后,用原生的HTML、CSS、JS这些东西会感觉到各种不便。比如:不能放心的使用模块化规范(浏览器兼容性问题)、即使可以使用模块化规范也会面临模块过多时的加载问题。 这时候…...
Docker部署单点Elasticsearch与Kibana
一 、 创建网络 因为需要部署kibana容器,因此需要让es和kibana容器互联。这里创建一个网络: docker network create es-net # 创建一个网络名称为:es-net 二 、拉取并加载镜像 方式一 docker pull elasticsearch:7.12.1 版本为elasticsearch的7…...
opencv实现仿射变换和透射变换
##1, 什么是仿射变换? 代码实现 import numpy as np import cv2 as cv import matplotlib.pyplot as plt#设置字体 from pylab import mpl mpl.rcParams[font.sans-serif] [SimHei]#图像的读取 img cv.imread("lena.png")#仿射变换 row…...
抖音seo账号矩阵源码系统
1. 开通多个抖音账号,并将它们归纳为一个账号矩阵系统。 2. 建立一个统一的账号管理平台,以便对这些账号进行集中管理,包括账号信息、内容发布、社区交互等。 3. 招募专业的运营团队,对每个账号进行精细化运营,包括内…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
