Java面试常见问题
2022-05-05 17:52:46 12 举报
AI智能生成
Java面试常见问题
作者其他创作
大纲/内容
Java基础
基础
==和equals的区别
我们重写equals,为什么还要重写hashCode
集合
HashMap
HashMap的底层原理
HashMap中的put是怎么实现的
HashMap什么时候需要扩容,resize()又是怎么扩容的
HashMap中的get是怎么实现的
HashMap是线程安全的吗
HashMap扩容为什么要是二的N次方
ArratList
LinkedList
设计模式
说说在工作中用到的设计模式,或者熟系的设计模式
创建型模式
工厂方法
抽象工厂
产品族
产品等级结构
单例模式
饿汉式单例
懒汉式单例
双重验证锁
静态内部类
容器式单例
原型模式
浅克隆
深克隆
建造者模式
结构型模式
代理模式
静态代理
动态代理
JDK代理
CgLib代理
适配器模式
桥接模式
装饰器模式(包装模式)
行为型模式
观察者模式
模板方法模式
策略模式
责任链模式
谈谈你对代理模式的理解
Spring
Spring IoC的理解和使用
Bean是怎么创建的
Sping注入Bean的方式有哪些
Bean的生命周期
说说Spring的模块有哪些
Spring一级缓存、二级缓存、三级缓存的作用
Spring是怎么解决循环依赖的,什么情况下解决不了循环依赖
Spring AOP的理解和使用
Spring AOP是在DI之前还是DI之后
Spring中声明式事务注解中的参数
rollbackFor
事务传播机制
Spring中事务失效的场景
Spring MVC的执行流程
Spring的Bean是线程安全的吗
MyBatis
MyBatis的整体流程
初始化配置文件
创建会话
拿到代理对象,调用方法执行sql
SpringBoot
启动流程
自动装配原理
说说Java的SPI和Spring的SPI
并发
创建线程的方式和区别
线程的生命周期和几种状态
死锁的基本条件
互斥
持有且等待
不可剥夺
循环等待
说说线程的启动和停止
什么是线程安全问题
Synchronized
Synchronized用在静态方法和用在非静态方法有什么区别
说说Synchronized的原理、这个对象锁是什么
Synchronized和Lock的区别
锁状态和锁升级
ThreadLocal
ThreadLocal的作用和原理
ThreadLocalMap的key是什么引用,为什么
为什么ThreadLocal用完的时候要调用remove()
BIO、NIO和AIO有什么区别
说一下Java内存空间的理解
谈谈volatile的作用
谈谈你对AQS的理解
通过名称来解释:抽象、同步、队列
说一下ReentrantLock的原理
ReentrantLock、CountDownLatch 、Cyclicbarrier和Semaphore区别(分别写出demo)
ConcurrentHashMap
线程池
JDK提供了多少种创建线程池的方式
分别说一下线程池的参数
为什么要自定义线程池
线程池的执行流程,它是怎么复用线程的
你知道JDK线程池和Tomcat线程池的区别吗
JVM
类加载过程
装载
将字节码文件转换为二进制字节流,将这个流的静态数据结构转换为方法区的数据结构,在生成一个类对象作为这个方法区的入口
链接
验证
对这个类进行验证,确保这个类没问题
准备
给这个类的静态成员变量分配内存,并初始化默认值
解析
将符号引用变为直接引用
初始化
最后是真正的对静态成员变量赋值
类对象的生命周期
装载
将我们的字节码文件转换为二进制的字节流,将这个流的静态数据结构转换为方法去的数据结构,并生成一个类对象作为方法区的访问接口
链接
验证
在对这个了进行验证,确保这个类没有问题
准备
为这个类的静态成员变量分配空间并初始化默认值
解析
将符号引用变为直接引用
初始化
将真正的值赋值给静态成员变量
使用
实例化一个对象
卸载
卸载需要满足三个条件
所有的实例对象被GC
加载这个类的类加载器被GC
类文件不在被引用
双亲委派机制
怎么理解双亲委派机制
双亲委派机制就是类加载器要加载类的时候,自己先不去加载,先丢给父类加载器去加载,父类加载不了才自己加载。以此类推。
怎么打破双亲委派机制
自定义一个类加载器,继承ClassLoader抽象类,重写loadClass()和findClass()
JVM运行时数据区
怎么理解JVM内部结构
方法区(元空间、非堆)
线程共享区域,里面存放的是静态成员变量,常量和字节码文件装载后的数据结构等
堆
也是线程共享区域,一般存放我们的对象
内部机构
又分为old区,young区。young区里面又有Eden区、S0区和S1区他这样设计是为了减少内存空间碎片
虚拟机栈
它是线程私有的,线程的方法又叫栈帧,每执行一个方法就会进栈,然后压栈。它们会按照先进后出的数据结构存储。
每一个栈帧里面又有局部变量表,操作数栈,动态链接和方法返回地址。
每一个栈帧里面又有局部变量表,操作数栈,动态链接和方法返回地址。
本地方法栈
是native方法特有的区域
程序计数器
他的作用是当线程在上下文切换的时候指针指向的位置
对象是不是垃圾
怎么判断一个对象是不是垃圾
引用计数
当一个对象被引用时,就不会被回收。这会有个问题,当两个对象循环引用时,就会导致内存溢出
可达性分析
别GC Root可达的对象都不是垃圾。像类加载器、静态成员变量、常量、局部变量表和Thread都是GC Root
当一个对象被标为垃圾,那他一定会被回收吗
不一定,如果这个类继承了Finalize,它就有一次免死的机会
当一个对象可达时,他一定不会被回收吗
不一定,如果这个对象是弱引用、软引用或者虚引用都会被回收
说说你知道的垃圾回收算法
标记清除算法
复制算法
标记整理
分代收集算法
说说你知道的垃圾收集器
串行类
内存较小,适合嵌入式
吞吐量大
使用交互不强的场景
注重停顿时间
CMS/G1 提升用户体验
怎么理解GC
GC就是指当堆内存不足时就会触发GC,每次GC都会STW,所以尽量能避免GC就避免GC
JVM常用命令
jps
查看进程PID
jinfo
查看JVM参数和动态修改JVM参数的命令(manageable)
jstat
查看JVM内存中所有堆和非堆使用情况
jstact
查看栈信息
jmap
查看堆信息
讲讲JVM调优思路
使用JVM常用命令去打印GC日志,堆信息情况和栈信息情况
在分析日志
修改代码或者调整参数然后在观察
MySQL
一条查询语句的执行流程
内部结构
缓存
解析器
预处理器
优化器
执行器
一条更新语句的执行流程
分层结构
连接层
服务层
存储引擎层
说下你对三大日志的理解
undolog
纪录回滚日志
redolog
两阶段提交,有防止宕机丢失数据的作用
binlog
纪录更新语句,有数据同步的作用
为什么redolog和binlog要进行两阶段提交呢?如果先直接纪录redolog,再写binlog会怎么样
MyISAM和InnoDB的区别
是否支持事务
查询效率
修改效率
MySQL索引用B+树有什么优势?为什么?
为什么用B+树,为什么不用红黑树
说一下你对MySQL索引的理解
聚集索引
非聚集索引
主键索引
普通索引
唯一索引
大文本索引
复合索引
索引创建应该注意哪些点 ?为什么?
最左匹配原则
能用复合索引替换普通索引就不用普通索引
索引列离散度不能太低
不是建越多索引越好
主键索引列的值最好是递增式的
大字段列最好不建立索引
什么是覆盖索引,什么是索引下推?
覆盖索引就是通过索引查找数据,不需要回表就能查出数据就叫覆盖索引
索引下推就是在复合索引中,只有当多个条件都满足才会回表,这就叫索引下推。索引下推是为了减少回表次数来增加效率
索引失效有哪些场景?为什么?
不符合最左匹配原则
%在左边
索引列的离散度太低
索引列直接计算
索引列使用函数
使用了or
not in、not exists
说说MySQL的锁
共享锁(读锁)
排他锁(写锁)
意向共享锁
意向排它锁
乐观锁
悲观锁
为什么MySQL的RR可解决幻读的问题
MySQL底层用到了MVCC,MVCC就是每个select都出产生一个ReadView版本,ReadView基于高水位和低水位来判断,从而解决了幻读问题
MVCC为什么可以做到可重复读
他每个select都会产生一个版本ReadView,依据ReadView的高水位、低水位来判断
说说你对InnoDB事务的理解,事务并发带来什么问题?怎么解决?
InnDB事务是基于三大日志来实现的,undolog纪录回滚日志,redolog做XA两阶段提交,binlog纪录更新语句
带来脏读、幻读、不可重复读的问题
脏读:使用读已提交隔离级别
不可重复读:使用可重复读隔离级别
幻读:基于MVCC版本的方式处理
不可重复读:使用可重复读隔离级别
幻读:基于MVCC版本的方式处理
谈谈你对MySQL优化的理解
操作系统和硬件层面:服务端部署在合适的操作系统,和更好的硬件上有注意效率的提升
MySQL配置层面:长连接时间,连接数,也有可能是服务器太长时间没重启了,重启一下
架构层面:数据量太大可考虑分库分表
表结构层面:存储引擎、表结构、字段类型、索引等
Redis
什么是Redis
Redis是属于NoSQL的一种数据库,它是基于内存存储的。它有速度快、支持多种数据类型、支持多种语言、持久化、淘汰机制、集群等的特性
为什么Redis的速度快
基于内存,相比于关系型数据库基于磁盘读写,基于内存会快很多
单线程,单线程就减少了CPU上下文切换所造成的开销。还有就是本身它的数据类型底层做了很多优化,比如以空间换时间
同步非阻塞IO
使用多路复用的IO模型
说一说你用到的数据类型
字符串(String)
哈希(Hash)
列表(List)
集合(Set)
有序集合(ZSet)
说一说淘汰机制
volatile+lru
针对一段时间最少使用的key淘汰
allkeys+lru
volatile+lfu
针对最不常用的key淘汰
allkeys+lfu
volatile+random
随机淘汰
allkeys+random
ttl
根据ttl的设计,将一些快要过期的key淘汰
noeviction*
不处理,只读不写
说一说持久化
RDB*
纪录快照
隔一段时间纪录一次快照
AOF
纪录操作语句
有每条、每秒、根据操作系统决定等策略
分布式锁的原理
说一说他的集群
MQ
为什么要用MQ,MQ解决了什么问题
异步,减少系统响应时间
解耦,使各个子系统只依赖MQ,减少系统间强依赖
削峰,并发量上来服务器扛不住,可用MQ匀速处理
引用MQ会出现什么问题
重复消费问题,本来只加一次钱,结果加了几次钱
数据一致性问题,消费失败等
消息丢失问题
消息顺序问题
如何解决这些问题
重复消费,给消息做幂等性处理,比如设置唯一值
数据一致性,补偿机制
消息丢失,设置消息回调机制,如果一段时间没有回调重新发送
消息顺序,在代码层做处理,如果不是指定步骤就等待
Kafka
RocketMQ
ActiveMQ
RabbitMQ
微服务
SpringCloudNetflix
Eureka
Gatway
OpenFeign
Ribbon
Hystrix
SpringCloudAlibaba
Nacos
Sentinel
什么是服务熔断,什么是服务降级
Seata
收藏
收藏
0 条评论
下一页