Java面试问题集锦

1.JDK、JRE、JVM 三者有什么关系?

  • JDK(全称 Java Development Kit),Java开发工具包,能独立创建、编译、运行程序。

JDK = JRE + java开发工具(javac.exe/java.exe/jar.exe)

  • JRE(全称 Java Runtime Environment),能运行已编译好的程序,但不能创建程序。

JRE = JVM + java核心类库

  • JVM (全称 Java Virtual Machine),java虚拟机。

2.java创建对象有哪些方式?

  • new 创建对象;
  • 反射机制创建对象;
  • 通过clone方法;
  • 序列化机制;

3.== 和 equals 有什么区别?

  • == :如果是基本数据类型,比较两个值是否相等;如果是对象,比较两个对象的引用是否相等,指向同一块内存区域;

  • equals:用于对象之间,比较两个对象的值是否相等。

4.hashCode()的作用?

生成哈希码,int类型,用于确定该对象在哈希表中的索引位置。每个类中都包含这个方法。

5.String、StringBuffer、StringBuilder 有什么区别?

  • String,采用 final修饰,对象不可变,线程安全。如果对一个已经存在的String对象修改,会重新创建一个新对象,并把值放进去;
  • StringBuffer,采用 synchronized 关键字修饰,线程安全;
  • StringBuilder,非线程安全,但效率会更高些,适用于单线程;

6.try-catch-finally,如catch中return了,还会执行finally吗?

当然啦,会在return之前执行。

7.进程和线程的区别?

  • 进程:是一个程序的执行流程,是系统进行资源分配和调度的基本单位,作用是程序能够并发执行提高资源利用率。因为进程的创建、销毁、切换产生大量的时间和空间的开销,所以进程的数量不能太多;

  • 线程:是比进程更小的能独立运行的基本单位,他是进程的一个实体,可以减少程序并发执行时的时间和空间开销,使得操作系统具有更好的并发性。多个线程可以共享进程的系统资源。线程基本不拥有系统资源,只有一些运行时必不可少的资源,比如程序计数器、寄存器和栈,进程则占有堆。

8.synchronized 的内部原理?

java提供的原子性内置锁,也被称为监视器锁。使用synchronized之后,会在编译之后在同步的代码块前后加上monitorentermonitorexit字节码指令,依赖操作系统底层互斥锁实现。实现原子性操作和解决共享变量的内存可⻅性问题。

内部处理过程(内部有两个队列waitSet和entryList。):

  • 1)当多个线程进入同步代码块时,首先进入entryList;

  • 2)有一个线程获取到monitor锁后,就赋值给当前线程,并且计数器+1;

  • 3)如果线程调用wait方法,将释放锁,当前线程置为null,计数器-1,同时进入waitSet等待被唤醒,调用notify或者notifyAll之后又会进入entryList竞争锁;

  • 4)如果线程执行完毕,同样释放锁,计数器-1,当前线程置为null;

图片

9.synchronized 和 ReentrantLock 的区别?

  • ReentrantLock 实现了Lock接口,synchronized是系统关键字;

  • ReentrantLock需要手动指定锁范围,synchronized 支持同步块、同步方法;

  • 都具有可重入性;

  • 默认都是非公平锁;但 ReentrantLock 还支持公平模式,但性能会急剧下降;

  • ReentrantLock 需要显示的获取锁、释放锁;

  • ReentrantLock 支持多种方式获取锁。

    • lock():阻塞模式来获取锁;

    • lockInterruptibly:阻塞式获取锁,支持中断;

    • tryLock():非阻塞模式尝试获取锁;

    • tryLock(long timeout, TimeUnit unit):同上,支持时间设置;

  • ReentrantLock 可以同时绑定多个Condition条件对象。

10.AQS (AbstractQueuedSynchronizer 抽象队列同步器 )的原理?

AQS内部维护一个state状态位,尝试加锁的时候通过CAS(CompareAndSwap)修改值,如果成功设置为 1,并且把当前线程ID赋值,则代表加锁成功。

一旦获取到锁,其他的线程将会被阻塞进入阻塞队列自旋,获得锁的线程释放锁的时候将会唤醒阻塞队列中的线程,释放锁的时候则会把state重新置为0,同时当前线程ID置为空。

11.CAS 有什么缺点?

在多线程场景下,更新变量值被其他线程跑了个对冲,CAS会出现ABA问题,解决方式有很多:

  • 可以通过,自增版本号方式,永远不会回退;

  • Java中提供了 AtomicStampedReference,增加了标志字段,更新时不光检查值,还要检查当前的标志是否等于预期标志,全部满足条件才会更新;

  • 更多内容,CAS原理分析,解决银行转账ABA难题

12.Java 都用过哪些锁?

  • 乐观锁、悲观锁

  • 分布式锁

  • 独占锁、共享锁

  • 互斥锁

  • 读写锁

  • 公平锁、非公平锁

  • 可重入锁

  • 自旋锁

  • 分段锁

  • 锁升级(无锁|偏向锁|轻量级锁|重量级锁)

  • 锁优化技术(锁粗化、锁消除)

  • 更多详细内容,一文全面梳理各种锁机制

13.HashMap原理?

内部由数组和链表组成,非线程安全。JDK1.7和1.8的主要区别在于头插和尾插方式的修改,头插容易导致HashMap链表死循环,并且1.8之后加入红黑树对性能有提升。

  • put插入:key 计算hash值,取模,找到数组位置,如果数组中没有元素直接存入,反之,则判断key是否相同,key相同就覆盖,否则就会插入到链表的尾部。如果链表的⻓度超过8且数据总量超过64,则会转换成红黑树。最后判断元素个数是否超过默认的⻓度(16)*负载因子(0.75),也就是12,超过则进行扩容。

  • get查询:计算出hash值,然后去数组查询,是红黑树就去红黑树查,链表就遍历链表查询就可以了。

红黑树的时间复杂度 O(logn);链表的时间复杂度 O(n),当链表过长时,红黑树能大大提高查询性能。

14.ConcurrentHashMap 如何能保证线程安全的?

ConcurrentHashmap在JDK1.7和1.8的版本改动比较大。

  • 1.7 使用Segment + HashEntry 分段锁的方式实现,Segment继承于ReentrantLockHashEntry存储键值对数据。

  • 1.8 采用数组+ 链表 + 红黑树。锁设计上抛弃了Segment分段锁,采用 CAS + synchronized 实现。

15.ArrayList 和 LinkedList 有什么区别?

1)Arraylist

  • 非线程安全

  • 底层采用数组存储

  • 插入、删除元素,时间复杂度受位置影响。默认是添加在列表的末尾,如果在位置 k 插入或删除一个元素,需要将k后面的元素后移或前移一位。

  • 支持随机访问,根据索引下标序号,可以快速定位元素

  • 需要连续的内存空间,中间不能有碎片

2)LinkedList

  • 非线程安全

  • 底层采用双向循环链表存储

  • 插入、删除元素,时间复杂度不受位置影响,只需要更改位置 k的前后指针地址,时间复杂度为 O(1)

  • 不支持高效的随机访问

  • 不需要连续的内存空间

16.volatile 原理?

volatile声明的变量,值被更新后对其他线程立即可⻅。

CPU会根据缓存一致性协议,强制线程重新从主内存加载最新的值到自己的工作内存中,而不是直接用cpu缓存中的值。

ThreadLocal 原理?

答案:ThreadLocal有一个静态内部类ThreadLocalMapThreadLocalMap又包含了一个Entry数组,Entry本身是一个弱引用,他的key是指向ThreadLocal的弱引用,Entry具备保存key -- value键值对的能力。

在使用完之后调用remove方法删除Entry对象,避免出现内存泄露。

什么是工作内存、主内存?

答案:

  • 工作内存:寄存器、CPU缓存(L1、L2、L3)

  • 主内存:主要是指物理内存

JUC并发包用过哪些线程安全的类?

答案:

  • ConcurrentHashMap

  • CountDownLatch、CyclicBarrier

  • Semaphore

  • BlockingQueue

  • ThreadPoolExecutor

  • ReentrantLock、ReentrantReadWriteLock

  • CompletableFuture

ThreadPoolExecutor 有哪些构造参数?

答案:核心线程数、最大线程数、最大空闲时间、时间单位、任务队列、线程工厂、拒绝策略

  • 更多内容,参考 史上最全ThreadPoolExecutor梳理(上篇)

  • 更多内容,参考 史上最全ThreadPoolExecutor梳理(下篇)

ThreadPoolExecutor 的拒绝策略有哪些?

答案:

  • 1、AbortPolicy:直接丢弃任务,抛出异常,这是默认策略

  • 2、CallerRunsPolicy:只用调用者所在的线程来处理任务

  • 3、DiscardOldestPolicy:丢弃等待队列中最旧的任务,并执行当前任务

  • 4、DiscardPolicy:直接丢弃任务,也不抛出异常

  • 5、使用RejectedExecutionHandler接口,自定义实现

线程有哪些状态?是如何转换?

答案:New、Runnable、Running、Blocked、Waiting、Timed Waiting、Terminated

图片

IO 模型有哪五种?

答案:

1、阻塞IO。当 应用B 发起读取数据申请时,如果内核数据没有准备好,应用B会一直处于等待数据状态,直到内核把数据准备好了交给应用B才结束。

2、非阻塞IO。当应用B发起读取数据申请时,如果内核数据没有准备好会即刻告诉应用B,不会让B在这里等待。

3、IO复用模型。进程通过将一个或多个fd传递给select,阻塞在select操作上,select帮我们侦测多个fd是否准备就绪,当有fd准备就绪时,select返回数据可读状态,应用程序再调用recvfrom读取数据。

4、信号IO。信号驱动IO不是用循环请求询问的方式去监控数据就绪状态,而是在调用sigaction时候建立一个SIGIO的信号联系,当内核数据准备好之后再通过SIGIO信号通知线程数据准备好后的可读状态,当线程收到可读状态的信号后,此时再向内核发起recvfrom读取数据的请求,因为信号驱动IO的模型下应用线程在发出信号监控后即可返回,不会阻塞,所以这样的方式下,一个应用线程也可以同时监控多个fd。

5、异步IO。解决了应用程序需要先后查看数据是否就绪发送接收数据请求两个阶段的模式,在异步IO的模式下,只需要向内核发送一次请求就可以完成状态查询和数据拷贝的所有操作。

阻塞IO 和 非阻塞IO 的区别?

答案:如果数据没有就绪,在查看数据是否就绪的这个阶段是一直等待?还是直接返回一个标志信息。

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

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

相关文章

Vscode——python环境输出中文乱码的解决方法

问题描述 python环境,采用UTF-8编码,运行后,输出中文乱码 解决方法 1、CtrlShiftP,打开设置Open Settings (JSON) 2 在用户设置中添加以下代码 // 配置python语言正常输出中文的环境 "code-runner.executorMap":{ …

小红书x-s算法及补环境 单旋转验证码

前言 大家好呀!新的一年,先祝大家新年快乐咯.祝大家逆向,风控都一把过咯. 新年第一篇文章,后续会持续更新哦! 春晚见证了中国经济的新风口,今年春晚互联网企业赞助商就两家,小红书和京东.小红书类似国外的ins,有预感未来小红书会大火,所以写了这篇文章,有需要的加我,联系方式…

一文读懂:通配符SSL证书价格大起底,如何选择最划算?

在互联网安全领域中,通配符SSL证书犹如一把全能保护伞,它能够一次性解决主域名及其所有子域名的安全加密问题。这种强大的兼容性和便捷管理特性使其成为众多网站的首选。然而,你是否好奇过,这样一款功能强大的SSL通配符证书究竟价…

什么是SSD型云服务器?

​  SSD云服务器是一种使用固态硬盘代替传统HDD进行存储的虚拟机。SDD 使用闪存单元来存储数据,与云计算技术相结合,形成强大且高效的存储解决方案,可以随时随地访问。 SSD云服务器如何工作? SSD云服务器是利用虚拟化和云计算技术创建的。…

“政务服务+AI交互数字人”,重新定义政务服务体验

随着AIGC发展,各地方政务部门纷纷通过AI交互数字人技术,提升企业和群众的办事效率、满意度,以数字人有效推动政务服务数字化、智能化发展。 *图片源于网络 如高新区将数字人海蓝作为政务服务大使,让数字人化身AI交互数字人可以面…

Excel之index、MATCH面试题、VLOOKUP函数,

VLOOKUP() 在表格的首列查找指定的数值,并返回表格当前行中指定列处的数值。 结构:VLOOKUP(查找值,查找区域,列序数,匹配条件) 解释:VLOOKUP(找谁,在哪里找,第几列,0或1) 1.目的:根据【产品】查找【销量】 公式:V…

Anaconda和TensorFlow环境搭建!!

Anaconda下载 进入官网下载 https://www.anaconda.com/download 也可以通过清华的映像站下载: https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ 我这里下载的是3.4.20版本。下载好就可以安装默认安装就行。 打开Anaconda Prompt修改成国内镜像 conda c…

运维SRE-18 自动化批量管理-ansible4

12.2handles handles触发器(条件),满足条件后再做什么事情应用场景:想表示:配置文件变化,再重启服务 配置handlers之前,每次运行剧本都会重启nfs,无论配置文件是否变化。 [rootm01 /server/ans/playbook]…

pycharm汉化包安装失败解决方法

直接去汉化包官网下载:汉化包官网 点击versiom 来到这个页面,然后根据我们PyCharm的版本进行安装对应的汉化包 如何查看pycharm版本? 点击help 再点击About 到这里就看得到对应的版本啦 下载完对应的汉化包之后一定要将它放到PyCharm/plug…

今日arXiv最热NLP大模型论文:无需提示也能推理!Google DeepMind新研究揭示AI内在推理能力

在人工智能领域,大语言模型(LLMs)已经在各种复杂的推理基准测试中展现出了令人瞩目的性能。传统上,这些推理能力是通过精心设计的提示技术来激发的,例如少量示例提示(few-shot prompting)或零示…

【高德地图】Android搭建3D高德地图详细教

📖Android搭建3D高德地图详细教程 📖第1章 高德地图介绍✅了解高德地图✅2D地图与3D地图 📖第2章 搭建3D地图并显示✅第 1 步:创建 Android 项目✅第 2 步:获取高德Key✅第 3 步:下载地图SDK✅第 4 步&…

【常用】添加作者传记,部分期刊需要例如IEEE ACCESS TCVSVT

1 添加在下面位置 \begin{IEEEbiography} [{\includegraphics[width1in,height1.25in,clip,keepaspectratio]{moumouxu.png}}] {Moumou Xu} is currently a full professor at the School of Computer and Software, Nanjing University of Information Science and Technolo…

最新版opencv4.9安装介绍,基本图像处理详解

文章目录 一、什么是OpenCV ?二. OpenCV 安装1. 下载地址2.安装命令:pip install opencv-python 三、图像基础1. 基本概念2. 坐标系3. 基本操作(彩色图片)(1)读取图片:cv2.imread( )&#xff08…

rt-thread 目录结构

移植适配可能需要修改的部分用红色标记,蓝色表示还需继续调查,绿色会在bring up后修改

arcmap行政区划空缺修复

拿到手的行政区划空间数据中间有空缺,可利用拓扑工具进行修复。 选择自定义》工具条》拓扑 选择拓扑 点击图标 选择需要修补的数据,点击即可 修补完成后

【前端素材】推荐优质后台管理系统Minia平台模板(附源码)

一、需求分析 后台管理系统是一种用于管理网站、应用程序或系统的工具,它通常作为一个独立的后台界面存在,供管理员或特定用户使用。下面详细分析后台管理系统的定义和功能: 1. 定义 后台管理系统是一个用于管理和控制网站、应用程序或系统…

【深度学习:计算机视觉】计算机视觉的最佳数据集 [行业细分]

【深度学习:计算机视觉】计算机视觉的最佳数据集 [行业细分] 什么是机器学习数据集 (ML)?什么是分类数据集?我应该使用合成数据来训练我的机器学习和计算机模型吗?在哪里可以找到机器学习的数据集&#xff…

Spring Boot application.properties和application.yml文件的配置

在Spring Boot中,application.properties 和 application.yml 文件用于配置应用程序的各个方面,如服务器端口、数据库连接、日志级别等。这两个文件是Spring Boot的配置文件,位于 src/main/resources 目录下。 application.properties 示例 …

分享一个我爱工具网源码优化版

应用介绍 本文来自:分享一个我爱工具网源码优化版 - 源码1688 前几天在网上看到了一个不错的工具网源码,但是源码存在一些问题,遂进行了修改优化。 主要修改内容有: 1、后台改为账号密码登录,上传即用,不…

matlab|电动汽车充放电V2G模型

目录 1 主要内容 1.1 模型背景 1.2 目标函数 2 部分代码 3 效果图 4 下载链接 1 主要内容 本程序主要建立电动汽车充放电V2G模型,采用粒子群算法,在保证电动汽车用户出行需求的前提下,为了使工作区域电动汽车尽可能多的消纳供给商场基础…