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集合遍历。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

控件【QT】

文章目录 控件QWidgetenabledgeometrysetGeometry qrcwindowOpacityQPixmapfonttoolTipfocusPolicystyleSheetQPushButtonRadio ButtionCheck Box显示类控件QProgressBarcalendarWidget 控件 Qt中已经提供了很多内置的控件了(按钮,文本框,单选按钮,复选按钮&#xff0c;下拉框…

docker pull Error response from daemon问题

里面填写 里面解决方案就是挂代理。 以虚拟机为例&#xff0c;将宿主机配置端口设置&#xff0c;https/http端口设为7899 配置虚拟机的http代理&#xff1a; vim /etc/systemd/system/docker.service.d/http-proxy.conf里面填写&#xff0c;wq保存 [Service] Environment…

linux 进程补充

环境变量 基本概念 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数 如&#xff1a;我们在编写C/C代码的时候&#xff0c;在链接的时候&#xff0c;从来不知道我们的所链接的动态静态库在哪 里&#xff0c;但是照样可以链接成功&#…

一文解释pytorch 中的 squeeze() 和 unsqueeze()函数(全网最详细版)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;零基础入门PyTorch框架_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 …

QT:对象树

1.概念 Qt 中的对象树是一种以树形结构组织 Qt 对象的方式。当创建一个QObject&#xff08;Qt 中大多数类的基类&#xff09;或其派生类的对象时&#xff0c;可以为其指定一个父对象&#xff08;parent&#xff09;。这个对象就会被添加到其父对象的子对象列表中&#xff0c;形…

labview通过时间计数器来设定采集频率

在刚接触labview的时候&#xff0c;笔者通常用定时里的等待函数来实现指令的收发&#xff0c;但是当用到的收发消息比较多时就出现了卡顿&#xff0c;卡死的情况&#xff0c;这是因为当用队列框架时&#xff0c;程序卡在了其中的一个分支里&#xff0c;等通过相应的延时后才可以…

2024最新前端面试题(附答案及解析)

文章目录 HTML篇1、HTML5有哪些新特性&#xff1f;2、介绍下 BFC 及其应用3、内元素和块级元素的区别&#xff1f;4、Doctype作用&#xff1f;标准模式与混杂模式如何区分&#xff1f;5、引入样式时&#xff0c;link和import的区别&#xff1f;6、介绍一下你对浏览器内核的理解…

Linux:文件系统(软硬链接)

目录 inode ext2文件系统 Block Group 超级块&#xff08;Super Block&#xff09; GDT&#xff08;Group Descriptor Table&#xff09; 块位图&#xff08;Block Bitmap&#xff09; inode位图&#xff08;Inode Bitmap&#xff09; i节点表&#xff08;inode Tabl…

Java基础面试题50题

1&#xff0c;""空字符串的作用 package com.neuedu.nineteen;public class Test {public static void main(String[] args) {String s"";for (char i a; i < d; i) {ssi;//输出abc // sis;//输出cba}System.out.println(s);} }如题所示&…

【技海登峰】Kafka漫谈系列(二)Kafka高可用副本的数据同步与选主机制

【技海登峰】Kafka漫谈系列(二)Kafka高可用副本的数据同步与选主机制 一. 数据同步 在之前的学习中有了副本Replica的概念,解决了数据备份的问题。我们还需要面临一个设计难题即:如何处理分区中Leader与Follwer节点数据同步不匹配问题所带来的风险,这也是保证数据高可用的…

GB/T 44721-2024 与 L3 自动驾驶:自动驾驶新时代的基石与指引

1.前言 在智能网联汽车飞速发展的当下&#xff0c;自动驾驶技术成为了行业变革的核心驱动力。从最初的辅助驾驶功能&#xff0c;到如今不断迈向高度自动化的征程&#xff0c;每一步都凝聚着技术的创新与突破。而在这一进程中&#xff0c;标准的制定与完善对于自动驾驶技术的规…

大语言模型的个性化综述 ——《Personalization of Large Language Models: A Survey》

摘要&#xff1a; 本文深入解读了论文“Personalization of Large Language Models: A Survey”&#xff0c;对大语言模型&#xff08;LLMs&#xff09;的个性化领域进行了全面剖析。通过详细阐述个性化的基础概念、分类体系、技术方法、评估指标以及应用实践&#xff0c;揭示了…

SpringBoot使用 easy-captcha 实现验证码登录功能

文章目录 一、 环境准备1. 解决思路2. 接口文档3. redis下载 二、后端实现1. 引入依赖2. 添加配置3. 后端代码实现4. 前端代码实现 在前后端分离的项目中&#xff0c;登录功能是必不可少的。为了提高安全性&#xff0c;通常会加入验证码验证。 easy-captcha 是一个简单易用的验…

国产编辑器EverEdit - 工具栏说明

1 工具栏 1.1 应用场景 当用户想显示/隐藏界面的标签栏、工具栏、状态栏、主菜单等界面元素时&#xff0c;可以通过EverEdit的菜单选项进行设置。 1.2 使用方法 选择菜单查看 -> 工具栏&#xff0c;在工具栏的子菜单中选择勾选或去掉勾选对应的选项。 标签栏&#xff1…

Redis的通用命令

⭐️前言⭐️ 本文主要介绍Redis的通用命令 &#x1f349;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f349;博主将持续更新学习记录收获&#xff0c;友友们有任何问题可以在评论区留言 &#x1f349;博客中涉及源码及博主日常练习代码均已上传GitHub &#x1f4cd;内容导…

机器学习专业毕设选题推荐合集 人工智能

目录 前言 毕设选题 开题指导建议 更多精选选题 选题帮助 最后 前言 大家好,这里是海浪学长毕设专题! 大四是整个大学期间最忙碌的时光&#xff0c;一边要忙着准备考研、考公、考教资或者实习为毕业后面临的升学就业做准备,一边要为毕业设计耗费大量精力。学长给大家整理…

Elasticsearch:如何搜索含有复合词的语言

作者&#xff1a;来自 Elastic Peter Straer 复合词在文本分析和标记过程中给搜索引擎带来挑战&#xff0c;因为它们会掩盖词语成分之间的有意义的联系。连字分解器标记过滤器等工具可以通过解构复合词来帮助解决这些问题。 德语以其长复合词而闻名&#xff1a;Rindfleischetik…

【后端开发】系统设计101——通信协议,数据库与缓存,架构模式,微服务架构,支付系统(36张图详解)

【后端开发】系统设计101——通信协议&#xff0c;数据库与缓存&#xff0c;架构模式&#xff0c;微服务架构&#xff0c;支付系统&#xff08;36张图&#xff09; 文章目录 1、通信协议通信协议REST API 对比 GraphQL&#xff08;前端-web服务&#xff09;grpc如何工作&#x…

Spark--如何理解RDD

1、概念 rdd是对数据集的逻辑表示&#xff0c;本身并不存储数据&#xff0c;只是封装了计算逻辑&#xff0c;并构建执行计划&#xff0c;通过保存血缘关系来记录rdd的执行过程和历史&#xff08;当一个rdd需要重算时&#xff0c;系统会根据血缘关系追溯到最初的数据源&#xff…

0205算法:最长连续序列、三数之和、排序链表

力扣128&#xff1a;最长连续序列 给定一个未排序的整数数组 nums &#xff0c;找出数字连续的最长序列&#xff08;不要求序列元素在原数组中连续&#xff09;的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 class Solution {public int longestConsecutive(in…