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

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

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

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

相关文章

计算机设计大赛 深度学习图像分类算法研究与实现 - 卷积神经网络图像分类

文章目录 0 前言1 常用的分类网络介绍1.1 CNN1.2 VGG1.3 GoogleNet 2 图像分类部分代码实现2.1 环境依赖2.2 需要导入的包2.3 参数设置(路径,图像尺寸,数据集分割比例)2.4 从preprocessedFolder读取图片并返回numpy格式(便于在神经网络中训练)2.5 数据预…

easyrecovery数据恢复软件14中文绿色版下载

EasyRecovery易恢复14全面介绍 一、功能概览 EasyRecovery易恢复14是一款功能强大的数据恢复软件,旨在帮助用户从各种存储介质中恢复丢失或删除的文件。无论是由于误删、格式化、系统崩溃还是其他未知原因导致的数据丢失,EasyRecovery易恢复14都能提供…

postman测试上传文件、导出excel的方法

按照如下操作步骤执行就可以了: 1、PostMan测试接口实现上传文件 第一步: 打开postman,将上传方式改为POST,再点击下【Body】 第二步: 然后,我们点击里面的【form-data】选项(如图所示)。 第三步&#xff…

Vue+SpringBoot打造超市自助付款系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 商品类型模块2.2 商品模块2.3 超市账单模块 三、界面展示3.1 登录注册模块3.2 超市商品类型模块3.3 超市商品模块3.4 商品购买模块3.5 超市账单模块 四、部分源码展示4.1 实体类定义4.2 控制器接口 五、配套文档展示六、…

Java智慧工地云综合管理平台SaaS源码 助力工地实现精细化管理

目录 智慧工地系统介绍 1、可视化大屏 2、视频监控 3、Wi-Fi安全教育 4、环境监测 5、高支模监测 6、深基坑监测 7、智能水电监测 8、塔机升降安全监测 智慧工地系统功能模块 1、基础数据管理 2、考勤管理 3、安全隐患管理 4、视频监控 5、塔吊监控 6、升降机监…

在 where子句中使用子查询(一)

目录 子查询返回单行单列 查询公司工资最低的员工信息 查找公司雇佣最早的员工信息 子查询返回单行多列 查询与 ALLEN 工资相同,职位相同的所有员工信息 子查询返回多行单列 IN 操作 查询职位是“MANAGER”的所有员工的薪水 Oracle从入门到总裁:https://bl…

2024022401-关系数据库设计理论

关系数据库设计理论 设计一个好的关系数据库系统,关键是要设计一个好的数据库模式(数据库逻辑设计问题) 数据库逻辑设计主要解决的问题 关系数据库应该组织成几个关系模式 关系模式中包括哪些属性 “不好”的数据库设计 举例&#xff1a…

雷达铅笔波束

黄色区域:铅笔波束 构图思想:先刷黄色三角形,在刷黄色圆 //画波束,//小飞机->扇形区域->铅笔波束painter->save();{ int diameter 26;//第一步先看画家当前坐标原点//测定(17,-2)坐标…

【flutter】环境安装

安装flutter sdk 下载sdk flutter sdk就包含dart,所以我们只用安装flutter sdk就可以了。 我们去清华大学开源软件镜像站下载,flutter开发中,版本对不上基本项目就跑步起来,如果是团队协同开发的话,建议统一下载指定版…

【初中生讲机器学习】12. 似然函数和极大似然估计:原理、应用与代码实现

创建时间:2024-02-23 最后编辑时间:2024-02-24 作者:Geeker_LStar 你好呀~这里是 Geeker_LStar 的人工智能学习专栏,很高兴遇见你~ 我是 Geeker_LStar,一名初三学生,热爱计算机和数学,我们一起加…

【办公类-16-10-01】“2023下学期 中4班 自主游戏观察记录(python 排班表系列)

背景需求 上学期的周安排里,每班每周的自主游戏会轮到多个不同的内容 因此在每周的自主游戏观察有2次记录,观察的项目可以写不一样的, 如一位老师写沙水游戏,另一位写表演游戏 本学期,中班的自主游戏全部是户外的&am…

vue 手势解锁功能

效果 实现 <script setup lang"ts"> const canvasRef ref<HTMLCanvasElement>() const ctx ref<CanvasRenderingContext2D | null>(null) const width px2px(600) const height px2px(700) const radius ref(px2px(50))const init () > …

滑动窗口刷题(二)

目录 1.最大连续1的个数 III 1.题目解析 2.算法原理 2.1暴力枚举&#xff08;不过多介绍&#xff09; 2.2双指针优化 3.代码编写 2. 将 x 减到 0 的最小操作数 1.题目解析 2.算法原理 2.1滑动窗口 3.代码编写 3. 水果成篮 1.题目解析 2.算法思路 2.1滑动窗口哈希…

基于Android的校园请假App的研究与实现

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

每日五道java面试题之spring篇(五)

目录&#xff1a; 第一题. 使用 Spring 有哪些方式&#xff1f;第二题. 什么是Spring IOC 容器&#xff1f;第三题. 控制反转(IoC)有什么作用?第四题. IOC的优点是什么&#xff1f;第五题. BeanFactory 和 ApplicationContext有什么区别&#xff1f; 第一题. 使用 Spring 有哪…

前沿科技速递——YOLOv9

随着YOLO系列的不断迭代更新&#xff0c;前几天&#xff0c;YOLO系列也迎来了第九个大型号的更新&#xff01;YOLOv9正式推出了&#xff01;附上原论文链接。 arxiv.org/pdf/2402.13616.pdf 同样是使用MS COCO数据集进行对比比较&#xff0c;通过折线图可看出AP曲线在全方面都…

018—pandas 生成笛卡尔积排列组合合并多列字符串数据

思路&#xff1a; 本需求需要将给定的几列数据&#xff0c;生成一个排列组合形式的数据列&#xff0c;利用到 Pandas 多层索引生成的笛卡尔积的方法。 二、使用步骤 1.引入库 代码如下&#xff08;示例&#xff09;&#xff1a; import pandas as pd2.读入数据 代码如下&…

手写redux和applyMiddleware中间件react示例

目录 一 核心代码 1.reducer 2.store.js 二 关于context API的使用 1. MyContext 2. createContext 3. ContextProvider 4. connect 三 组件验证效果 1. Todo 2. TodoList 3.TodoItem 4.TodoInput 5. App组件引入Todo组件 一 核心代码 1.reducer // 新增列表数…

发布订阅模式:观察者模式的一种变体

发布-订阅模型&#xff08;Publish-Subscribe Model&#xff09;的底层机制通常基于观察者模式。 发布-订阅模型是观察者模式的一种变体。 在观察者模式中&#xff0c;主题&#xff08;或被观察者&#xff09;维护了一组观察者&#xff0c;当主题的状态发生变化时&#xff0c…

【Postman+Newman】接口自动化测试以及测试报告输出

Newmanpostman自动化测试 postmanPre-request Script前置脚本 Newman测试报告输出 postman 学习postman脚本编写 Pre-request Script前置脚本 Newman 测试报告输出 输出报告时使用的命令&#xff1a;     -r html,json,junit 指定生成html&#xff0c;json&#xff0c…