当前位置: 首页 > article >正文

Java面试题集合篇5:10道基础面试题

文章目录

  • 前言
  • 41、多线程使用 ArrayList
  • 42、List 和 Set 区别
  • 43、HashSet 实现原理
  • 44、HashSet检查重复和保证数据不可重复
  • 45、BlockingQueue
  • 46、Map接口
    • 46.1、HashMap实现原理
    • 46.2、HashMap在JDK1.7和JDK1.8中不同点
    • 46.3、JDK1.7 VS JDK1.8 比较
  • 47、HashMap的put方法流程
  • 48、HashMap解决哈希冲突
  • 48、HashMap 长度是2的幂次方
  • 49、HashMap 与 HashTable 区别
  • 50、如何决定使用 HashMap 还是TreeMap

前言

亲爱的家人们,创作很不容易,若对您有帮助的话,请点赞收藏加关注哦,您的关注是我持续创作的动力,谢谢大家!有问题请私信或联系邮箱:fn_kobe@163.com

41、多线程使用 ArrayList

ArrayList 线程不安全,遇到多线程场景,通过 Collections 的 synchronizedList 方法将其转换成线程安全容器后再使用。

List<String> synchronizedList = Collections.synchronizedList(list);
synchronizedList.add("aaa");
synchronizedList.add("bbb");
for (int i = 0; i < synchronizedList.size(); i++) {
System.out.println(synchronizedList.get(i));
}

42、List 和 Set 区别

相同点:都继承自Collection 接口

①List 特点:一个有序容器,元素可重复,插入多个null元素,元素都有索引。常用实现类:ArrayList、LinkedList 和 Vector。
②Set 特点:一个无序容器,不可存储重复元素,只允许存一个null元素,保证元素唯一性。常用实现类:HashSet、LinkedHashSet 以及 TreeSet。

③Set和List对比
Set:检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。
List:List动态增长,查找元素效率高,插入删除元素效率低,会引起其他元素位置改变。

43、HashSet 实现原理

基于HashMap实现,HashSet值存放于HashMap的key上,HashMap的value统一为PRESENT,HashSet 实现简单,相关 HashSet 操作,都是直接调用底层 HashMap 相关方法来完成。

44、HashSet检查重复和保证数据不可重复

向HashSet 中add ()元素时,判断元素是否存在依据,不仅要比较hash值,同时还要结合equles方法比较。HashSet 中的add ()方法会使用HashMap 的put()方法。
HashMap的key唯一, HashSet添加值作为 HashMap的key,并在HashMap中如果K/V相同时,会用新V覆盖掉旧V,然后返回旧的V。( HashMap 比较key是否相等:先比较hashcode再比较equals )。

45、BlockingQueue

Java.util.concurrent.BlockingQueue是一个队列,在进行检索或移除一个元素时候,等待队列变为非空;添加一个元素时,等待队列中可用空间。

BlockingQueue接口是Java集合框架的一部分,用于实现生产者-消费者模式不需要担心等待生产者有可用空间,或消费者有可用对象,BlockingQueue的实现类中会处理。

Java提供BlockingQueue的实现,比如ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue、SynchronousQueue等。

①在 Queue 中 poll()和 remove()区别

相同点:都是返回第一个元素,并在队列中删除返回的对象。
不同点:如果没有元素 poll()会返回 null,而 remove()会直接抛出 NoSuchElementException 异常。

46、Map接口

46.1、HashMap实现原理

HashMap概述:基于哈希表Map接口的非同步实现。提供所有可选映射操作,并允许使用null值和null键。不保证映射顺序。

HashMap数据结构: 在Java编程语言中, 两种基本结构:一个是数组,另外一个是模拟指针(引用),所有数据结构都可用这两个基本结构来构造。HashMap是一个“链表散列”的数据结构,即数组和链表的结合体

HashMap基于Hash算法实现
①往Hashmap中put元素,利用keyhashCode重新hash计算出当前对象元素在数组中下标
②存储时出现hash值相同key,有两种情况。(1)如果key相同,则覆盖原始值;(2)如果key不同(出现冲突),将当前key-value 放入链表中
③获取时直接找到hash值对应下标,在进一步判断key是否相同,从而找到对应值。

HashMap解决hash冲突问题,核心使用数组存储方式,将冲突key对象放入链表中,一旦发现冲突就在链表中做进一步对比。
Jdk 1.8中对HashMap实现优化,当链表中节点数据超过八个,链表会转为红黑树提高查询效率,时间复杂度从原来O(n)到O(logn)

46.2、HashMap在JDK1.7和JDK1.8中不同点

在Java中,保存数据的数据结构:数组和链表。
数组特点:寻址容易,插入和删除困难
链表特点:寻址困难,但插入和删除容易;
将数组和链表结合,发挥各自优势,使用拉链法解决哈希冲突。

JDK1.8之前:采用拉链法。拉链法:将链表和数组相结合。

JDK1.8之后当链表长度大于阈值(默认为8)时,将链表转化为红黑树,以减少搜索时间。

46.3、JDK1.7 VS JDK1.8 比较

JDK1.8主要解决或优化问题

①resize 扩容优化。

②引入红黑树,目的是避免单条链表过长而影响查询效率。

③解决多线程死循环问题,但仍是非线程安全的,多线程时会造成数据丢失问题。
在这里插入图片描述

47、HashMap的put方法流程

①判断键值对数组table[i]是否为空或为null,否则执行resize()进行扩容;

②根据键值key计算hash值得到插入数组索引i,如果table[i]==null,直接新建节点添加,转向⑥,如果table[i]不为空,转向③;

③判断table[i]首个元素是否和key一样,如果相同直接覆盖value,否则转向④

④相同指hashCode以及equals;

④判断table[i] 是否为treeNode,即table[i] 是否是红黑树,如果是红黑树,则直接在树中插入键值对,否则转向⑤;

⑤遍历table[i],判断链表长度是否大于8,大于8的话把链表转换为红黑树,在红黑树中执行插入操作,否则进行链表插入操作;遍历过程中若发现key已经存在直接覆盖value;

⑥插入成功后,判断实际存在键值对数量size是否超多大容量threshold,如果超过,进行扩容。

48、HashMap解决哈希冲突

哈希定义:一种将任意长度消息压缩到某一固定长度消息摘要函数。

散列函数基本特性根据同一散列函数计算出散列值如果不同,那么输入值肯定也不同。但是,根据同一散列函数计算出的散列值如果相同,输入值不一定相同

哈希碰撞:当两个不同输入值,根据同一散列函数计算出相同散列值。

HashMap数据结构
数组特点:寻址容易,插入和删除困难;
链表特点:寻址困难,但插入和删除容易;
将数组和链表结合,发挥各自优势,使用链地址法解决哈希冲突,将拥有相同哈希值对象组织成一个链表放在hash值所对应bucket下。

48、HashMap 长度是2的幂次方

让 HashMap 存取高效,尽量较少碰撞,要尽量把数据分配均匀,每个链表/红黑树长度大致相同。
“取余(%)操作中如果除数是2的幂次则等价于与其除数减一的与(&)操作(也就是说 hash%length==hash&(length-1)的前提是 length 是2的 n 次方;)。” 并且采用二进制位操作 &,相对于%能够提高运算效率

49、HashMap 与 HashTable 区别

线程安全: HashMap:非线程安全,HashTable:线程安全;HashTable 内部方法经过 synchronized 修饰。(保证线程安全建议使用 ConcurrentHashMap);

效率: 因为线程安全问题,HashMap要比HashTable效率高。*另外,HashTable 基本被淘汰

对Null key 和Null value的支持: HashMap中,null 作为键,键只有一个,有一个或多个键所对应值为 null。在HashTable中 put 进键值有一个 null,直接抛NullPointerException。

初始容量大小和每次扩充容量大小不同
①Hashtable默认初始大小11,之后每次扩充,容量变为原来2n+1。HashMap 默认初始化大小16。之后每次扩充,容量变为原来2倍。
②创建时如给定容量初始值,那么Hashtable会直接使用给定大小,而 HashMap会将其扩充为2幂次方大小。

底层数据结构: JDK1.8 后 HashMap在解决哈希冲突时有变化,当链表长度大于阈值(默认为8)时,将链表转化为红黑树,以减少搜索时间。Hashtable 没有这样的机制。

推荐使用:推荐在单线程环境下使用 HashMap 替代,如果需要多线程则用 ConcurrentHashMap 替代。

HashMap 和 ConcurrentHashMap 的区别
ConcurrentHashMap对整个桶数组进行分割分段(Segment),然后在每一个分段上都用lock锁进行保护,相对于HashTable的synchronized 锁的粒度更精细,并发性能更好,而HashMap没有锁机制,不是线程安全的。(JDK1.8之后ConcurrentHashMap一种全新的方式实现,利用CAS算法。)

HashMap的键值对允许有null,但是ConCurrentHashMap都不允许

50、如何决定使用 HashMap 还是TreeMap

HashMap:在Map中插入、删除和定位元素。
TreeMap:对一个有序的key集合遍历。

相关文章:

Java面试题集合篇5:10道基础面试题

文章目录 前言41、多线程使用 ArrayList42、List 和 Set 区别43、HashSet 实现原理44、HashSet检查重复和保证数据不可重复45、BlockingQueue46、Map接口46.1、HashMap实现原理46.2、HashMap在JDK1.7和JDK1.8中不同点46.3、JDK1.7 VS JDK1.8 比较 47、HashMap的put方法流程48、…...

汽车加气站操作工试题及答案​

1.天然气的主要成分是&#xff08; &#xff09;​ A. 乙烷 B. 乙烯 C. 甲烷 D. 乙炔​ 答案&#xff1a;C​ 2.加气站中&#xff0c;用来储存天然气的设备是&#xff08; &#xff09;​ A. 加气机 B. 压缩机 C. 储气井 D. 脱水装置​ 答案&#xff1a;C​ 3.以下哪…...

Rust错误处理:从灭火器到核按钮的生存指南

开篇&#xff1a;错误处理的生存哲学 在Rust的平行宇宙里&#xff0c;错误分为两种人格&#xff1a; panic! → 核按钮&#x1f4a3;&#xff08;不可恢复&#xff0c;全系统警报&#xff09;Result → 灭火器&#x1f9ef;&#xff08;可控制&#xff0c;局部处理&#xff0…...

企业四要素如何用PHP进行调用

一、什么是企业四要素&#xff1f; 企业四要素接口是在企业三要素&#xff08;企业名称、统一社会信用代码、法定代表人姓名&#xff09;的基础上&#xff0c;增加了一个关键要素&#xff0c;通常是企业注册号或企业银行账户信息。这种接口主要用于更全面的企业信息验证&#x…...

【大数据技术】搭建完全分布式高可用大数据集群(Hadoop+MapReduce+Yarn)

搭建完全分布式高可用大数据集群(Hadoop+MapReduce+Yarn) jdk-8u361-linux-x64.tarhadoop-3.3.6.tar.gz注:请在阅读本篇文章前,将以上资源下载下来。 写在前面 本文主要介绍搭建完全分布式高可用集群Hadoop+MapReduce+Yarn的详细步骤。 注意: 统一约定将软件安装包存放…...

【MySQL】MySQL经典面试题深度解析

文章目录 一、MySQL与C的深度结合1.1 为什么C项目需要MySQL&#xff1f;1.2 典型应用场景 二、基础概念面试题精讲2.1 存储引擎对比2.2 索引原理 三、C专项面试题解析3.1 连接池实现3.2 预处理语句3.3 批量操作优化 四、高级应用面试题剖析4.1 事务隔离级别4.2 锁机制详解4.3 查…...

GitHub Copilot 越狱漏洞

研究人员发现了两种操控 GitHub 的人工智能&#xff08;AI&#xff09;编码助手 Copilot 的新方法&#xff0c;这使得人们能够绕过安全限制和订阅费用、训练恶意模型等。 第一种技巧是将聊天交互嵌入 Copilot 代码中&#xff0c;利用 AI 的问答能力&#xff0c;使其产生恶意输…...

React组件开发技巧:如何优雅地传递Props?

React组件开发技巧&#xff1a;如何优雅地传递Props&#xff1f; 一、重复Props传递的痛点二、JSX展开语法的优雅解决方案语法解析适用场景 三、使用展开语法的注意事项1. **可读性风险**2. **Props冲突问题**3. **过度使用展开语法** 四、实际项目中的最佳实践五、总结六、扩展…...

Flask+gevent 实现异步请求处理

Flaskgevent 实现异步请求处理 使用flaskgevent实现异步请求处理&#xff0c;首先gevent库要使用猴子布丁&#xff0c;使底层I/O支持异步处理。 1 使用猴子补丁 from gevent import monkey monkey.patch_all()使用猴子补丁后&#xff0c; 内建函数time.sleep()已经魔改成gev…...

Python利用VideoCapture和FFmpeg读取多个rtsp流性能的比较

最近一个项目&#xff0c;要用python读取30个海康摄像头的rtsp流&#xff0c;一开始直接用cv2.VideoCapture(video_path)&#xff0c;结果运行一段时间后发现读出来的frame经常出现花屏的现象。所以通过两种方式对程序进行了修改。 1、我先是通过cap.set(cv2.CAP_PROP_BUFFERS…...

Selenium 浏览器操作与使用技巧——详细解析(Java版)

目录 一、浏览器及窗口操作 二、键盘与鼠标操作 三、勾选复选框 四、多层框架/窗口定位 五、操作下拉框 六、上传文件操作 七、处理弹窗与 alert 八、处理动态元素 九、使用 Selenium 进行网站监控 前言 Selenium 是一款非常强大的 Web 自动化测试工具&#xff0c;能够…...

git 项目的更新

更新项目 当自己的本地项目与 远程的github 的仓库已经建立远程连接时&#xff0c; 则直接按照下面的步骤&#xff0c; 将本地的项目代码更新到远程仓库。 # Stage the resolved file git add README.md <file1> <file2># To stage all changes: git add .# Comm…...

UE虚幻引擎No Google Play Store Key:No OBB found报错如何处理

UE虚幻引擎No Google Play Store Key&#xff1a;No OBB found报错如何处理&#xff1f; 问题描述&#xff1a; UE成功打包APK并安装过后&#xff0c;启动应用时提示&#xff1a; No Google Play Store KeyNo OBB found and no store key to try to download. Please setone …...

吴恩达深度学习——卷积神经网络实例分析

内容来自https://www.bilibili.com/video/BV1FT4y1E74V&#xff0c;仅为本人学习所用。 文章目录 LeNet-5AlexNetVGG-16ResNets残差块 1*1卷积 LeNet-5 输入层&#xff1a;输入为一张尺寸是 32 32 1 32321 32321的图像&#xff0c;其中 32 32 3232 3232是图像的长和宽&…...

LabVIEW的智能电源远程监控系统开发

在工业自动化与测试领域&#xff0c;电源设备的精准控制与远程管理是保障系统稳定运行的核心需求。传统电源管理依赖本地手动操作&#xff0c;存在响应滞后、参数调节效率低、无法实时监控等问题。通过集成工业物联网&#xff08;IIoT&#xff09;技术&#xff0c;实现电源设备…...

【自动化办公】批量图片PDF自定义指定多个区域识别重命名,批量识别铁路货物运单区域内容改名,基于WPF和飞桨ocr深度学习模型的解决方案

项目背景介绍 铁路货运企业需要对物流单进行长期存档&#xff0c;以便后续查询和审计。不同的物流单可能包含不同的关键信息&#xff0c;通过自定义指定多个区域进行识别重命名&#xff0c;可以使存档的图片文件名具有统一的规范和明确的含义。比如&#xff0c;将包含货物运单…...

neo4j-在Linux中安装neo4j

目录 切换jdk 安装neo4j 配置neo4j以便其他电脑可以访问 切换jdk 因为我安装的jdk是1.8版本的&#xff0c;而我安装的neo4j版本为5.15,Neo4j Community 5.15.0 不支持 Java 1.8&#xff0c;它要求 Java 17 或更高版本。 所以我需要升级Java到17 安装 OpenJDK 17 sudo yu…...

专业学习|通过案例了解蒙特卡罗模拟实操步骤与含义

一、蒙特卡罗模拟介绍 蒙特卡罗模拟&#xff08;Monte Carlo Simulation&#xff09;是一种基于随机采样的数值计算方法&#xff0c;用于解决具有不确定性或复杂概率分布的问题。其核心思想是通过多次随机抽样来逼近系统的行为或目标函数的真实值&#xff0c;进而对系统进行评估…...

数据结构【链栈】

基于 C 实现链表栈&#xff1a;原理、代码与应用 一、引言 栈就是一个容器&#xff0c;可以当场一个盒子&#xff0c;只能一个一个拿&#xff0c;一个一个放&#xff0c;而且是从上面放入。 有序顺序栈操作比较容易【会了链栈之后顺序栈自然明白】&#xff0c;所以我们这里只…...

《数据可视化新高度:Graphy的AI协作变革》

在数据洪流奔涌的时代&#xff0c;企业面临的挑战不再仅仅是数据的收集&#xff0c;更在于如何高效地将数据转化为洞察&#xff0c;助力决策。Graphy作为一款前沿的数据可视化工具&#xff0c;凭借AI赋能的团队协作功能&#xff0c;为企业打开了数据协作新局面&#xff0c;重新…...

rust安装笔记

安装笔记 安装加速cargo 国内源nightly版本安装其他目标将现有项目迁移到新版本升级 安装加速 export RUSTUP_UPDATE_ROOT"https://mirrors.ustc.edu.cn/rust-static/rustup" export RUSTUP_DIST_SERVERhttps://mirrors.tuna.tsinghua.edu.cn/rustup curl --proto h…...

人工智能|本地部署|ollama+chatbox快速Windows10下部署(初级篇)

一、 前言&#xff1a; 其实早一个月我已经使用过deepseek&#xff0c;并且也在自己的机器上通过ollama部署过&#xff0c;但一直没有太多动力&#xff0c;现在感觉还是的记录一下&#xff0c;省的自己给忘掉了 本文只是简单记录一下ollamaopen-webuichatbox部署通过网盘分享…...

Android Studio 下载安装教程(2024 更新版),附详细图文

今天&#xff0c;为大家带来的是Android Studio 2024更新版的下载安装教程&#xff0c;包含详细图文步骤。 随着 Android Studio 的不断更新&#xff0c;自从引入 Koala 系列后&#xff0c;其版本号的命名规则也发生了变化。以本次更新为例&#xff0c;版本号为 2024.2.1&#…...

【人工智能】通用人工智能 AGI

AGI 是 Artificial General Intelligence 的缩写&#xff0c;中文翻译为通用人工智能。与我们常见的**特定人工智能&#xff08;Narrow AI&#xff09;**不同&#xff0c;AGI 是一个更高深、更具野心的目标。 AGI&#xff08;人工通用智能&#xff09;的定义 通用人工智能&am…...

Android车机DIY开发之软件篇(九) NXP AutomotiveOS编译

Android车机DIY开发之软件篇(十一) NXP AutomotiveOS编译 Google 在汽车上也提供了用于汽车的 Google 汽车服务&#xff08;GAS&#xff0c;Google Automotive Service&#xff09;&#xff0c;包含有 Google 地图、应用市场、Google 汽车助理等等。Google 汽车服务同样没有开…...

6.【BUUCTF】[SUCTF 2019]CheckIn

打开题目页面如下 看样子是一道有关文件上传的题 上传一句话木马 显示&#xff1a;非法后缀&#xff01; 看来.php后缀被过滤了 上传一张带有木马的照片 在文件地址处输入cmd 输入以下代码执行 copy 1.jpg/b4.php/a 5.jpg 最后一行有一句话木马 上传带有木马的图片 但其实…...

在线教程丨YOLO系列10年更新11个版本,最新模型在目标检测多项任务中达SOTA

YOLO (You Only Look Once) 是计算机视觉领域中最具影响力的实时目标检测算法之一&#xff0c;以其高精度与高效性深受业界青睐&#xff0c;广泛应用于自动驾驶、安防监控、医疗影像等领域。 该模型最早于 2015 年由华盛顿大学研究生 Joseph Redmon 发布&#xff0c;开创了将目…...

ES6 变量解构赋值总结

1. 数组的解构赋值 1.1 基本用法 // 基本数组解构 const [a, b, c] [1, 2, 3]; console.log(a); // 1 console.log(b); // 2 console.log(c); // 3// 跳过某些值 const [x, , y] [1, 2, 3]; console.log(x); // 1 console.log(y); // 3// 解构剩余元素 const [first, ...re…...

FreeRTOS学习 --- 中断管理

什么是中断&#xff1f; 让CPU打断正常运行的程序&#xff0c;转而去处理紧急的事件&#xff08;程序&#xff09;&#xff0c;就叫中断 中断执行机制&#xff0c;可简单概括为三步&#xff1a; 1&#xff0c;中断请求 外设产生中断请求&#xff08;GPIO外部中断、定时器中断…...

Docker基础以及单体实战

Docker 一、Docker1.1 Docker组成1.2 Dcoker运行图1.3 名称空间Namepace 1.4 docker、Docker compose、kubermetes 二、Docker安装2.1 在线Docker安装2.2 使用官方通用安装脚本2.3 二进制安装Docker三、Docker基础命令3.1 启动类3.2 镜像类3.3 容器类3.4 网络类3.5 Docker comp…...