Java面试问题集锦

news2024/11/19 2:43:02

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 的区别?

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

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

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

相关文章

MyBatis之Mapper.xml文件中parameterType,resultType,resultMap的用法

MyBatis之自定义数据类型转换器 前言1.parameterType2.resultType3.resultMap实例代码总结 前言 今天我们来学习Mapper.xml(编写SQL的)文件中,增删改查标签中,使用parameterType属性指定传递参数类型,resultType属性指…

C# OpenCvSharp 利用白平衡技术进行图像修复

目录 效果 灰度世界(GrayworldWB)-白平衡算法 完美反射(SimpleWB)-白平衡算法 基于学习的(LearningBasedWB)-白平衡算法 代码 下载 C# OpenCvSharp 利用白平衡技术进行图像修复 OpenCV xphoto模块中提供了三种不同的白平衡算法,分别是:灰度世界(G…

Linux进一步研究权限-----------ACL使用

一、使用情况 1.1、场景: 某个大公司,在一个部门,有一个经理和手下有两个员工,在操控一个Linux项目,项目又分为三期做,然而一期比较重要,经理带着员工做完了,公司就觉得技术难点已经做完攻克了&#xff0…

npm install报错解决记录

npm install报错解决记录 常见错误类型 权限错误: EACCES: permission denied EPERM: operation not permitted网络错误: ECONNREFUSED: Connection refused ETIMEDOUT: connect ETIMEDOUT包解析错误: Cannot find module ‘xxx’ Error: No compatible version found编译错误…

飞行机器人专栏(十三)-- 智能优化算法之粒子群优化算法与多目标优化

一、理论基础 1.1 引言 粒子群优化算法(Particle Swarm Optimization, PSO)自1995年由Eberhart和Kennedy提出以来,已经成为解决优化问题的一种有效且广泛应用的方法。作为一种进化计算技术,PSO受到社会行为模式,特别是…

互联设备-中继器-路由器等

网卡的主要作用 1 在发送方 把从计算机系统要发送的数据转换成能在网线上传输的bit 流 。 2 在接收方 把从网线上接收来的 bit 流重组成计算机系统可以 处理的数据 。 3 判断数据是否是发给自己的 4 发送和控制计算机系统和网线数据流 计算机的分类 1、台式机 2、小型机和服…

【DDD】学习笔记-薪资管理系统的测试驱动开发

回顾薪资管理系统的设计建模 在 3-15 课,我们通过场景驱动设计完成了薪资管理系统的领域设计建模。既然场景驱动设计可以很好地与测试驱动开发融合在一起,因此根据场景驱动设计的成果来开展测试驱动开发,就是一个水到渠成的过程。让我们先来…

rem适配方案

目录 一,rem实际开发适配方案 二,rem适配方案技术使用(市场主流) 方案一: 方案二:​编辑 一,rem实际开发适配方案 ① 按照设计稿与设备宽度的比例,动态计算并设置html根标签的fo…

【自然语言处理-二-attention注意力 是什么】

自然语言处理二-attention 注意力机制 自然语言处理二-attention 注意力记忆能力回顾下RNN(也包括LSTM GRU)解决memory问题改进后基于attention注意力的modelmatch操作softmax操作softmax值与hidder layer的值做weight sum 计算和将计算出来的和作为memo…

Jetpack Compose 架构层

点击查看:Jetpack Compose 架构层 官网 本页面简要介绍了组成 Jetpack Compose 的架构层,以及这种设计所依据的核心原则。 Jetpack Compose 不是一个单体式项目;它由一些模块构建而成,这些模块组合在一起,构成了一个完…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的人脸表情识别系统(附完整资源+PySide6界面+训练代码)

摘要:本篇博客呈现了一种基于深度学习的人脸表情识别系统,并详细展示了其实现代码。系统采纳了领先的YOLOv8算法,并与YOLOv7、YOLOv6、YOLOv5等早期版本进行了比较,展示了其在图像、视频、实时视频流及批量文件中识别人脸表情的高…

【elementUi-table表格】 滚动条 新增监听事件; 滚动条滑动到指定位置;

1、给滚动条增加监听 this.dom this.$refs.tableRef.bodyWrapperthis.dom.scrollTop 0let _that thisthis.dom.addEventListener(scroll, () > {//获取元素的滚动距离let scrollTop _that.dom.scrollTop//获取元素可视区域的高度let clientHeight this.dom.clientHeigh…

springboot+vue项目基础开发(17)路由使用

路由 在前端中,路由指的是根据不同的访问路径,展示不同的内容 vue Router的vue.js的官方路由 安装vue Router 再启动 在src下面新建router文件,创建index.js 代码 import {createRouter,createWebHashHistory} from vue-router //导入组件 import Login from @/views/Log…

SparkSQL学习03-数据读取与存储

文章目录 1 数据的加载1.1 方式一:spark.read.format1.1.1读取json数据1.1.2 读取jdbc数据 1.2 方式二:spark.read.xxx1.2.1 读取json数据1.2.2 读取csv数据1.2.3 读取txt数据1.2.4 读取parquet数据1.2.5 读取orc数据1.2.6 读取jdbc数据 2 数据的保存2.1…

RT-Thread-快速入门-2-时钟与定时器

时钟与定时器 阅读须知 定义与作用 定义 系统时钟 系统时钟在RT-Thread中用于管理时间,为系统运行提供时间基准。系统时钟由硬件计时器(通常是CPU的内部定时器或外部定时器)提供时钟节拍,这些时钟节拍通常以固定频率中断CPU&#…

opengl 学习纹理

一.纹理是什么? 纹理是一个2D图片(甚至也有1D和3D的纹理),它可以用来添加物体的细节;类似于图像一样,纹理也可以被用来储存大量的数据,这些数据可以发送到着色器上。 采样是指用纹理坐标来获取纹…

npm install 失败,需要node 切换到 对应版本号

npm install 失败 原本node 的版本号是16.9,就会报以上错误 node版本问题了,我切到这个版本,报同样的错。降一下node(14.18)版本就好了 具体的方法:(需要在项目根目录下切换) 1. …

微服务学习

一、服务注册发现 服务注册就是维护一个登记簿,它管理系统内所有的服务地址。当新的服务启动后,它会向登记簿交待自己的地址信息。服务的依赖方直接向登记簿要Service Provider地址就行了。当下用于服务注册的工具非常多ZooKeeper,Consul&am…

JavaScript从零写网站《一瞬》开发日志20240223

产品介绍 一个无需注册能随时发布图片并配一段文字介绍的app,有时间线,用户在主页面向下滑动,可以看到被发布的若干图片,并且能够在每一个发布处做基本互动——评论,点赞 编程语言 本产品使用htmlcssJavaScript开发…

【Docker】构建pytest-playwright镜像并验证

Dockerfile FROM ubuntu LABEL maintainer "langhuang521l63.com" ENV TZAsia/Shanghai #设置时区 #安装python3依赖与下载安装包 RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone \&& apt update \&&…