我的JAVA面试题备忘录
前言
以下是我收集的一些问题,有的是网上摘录的,有的是自己参加面试被问到的,有的是工作或学习时遇到的,等等。
为什么要记录这些呢?
一方面,我相信,这样做对我自己的技术提升是有帮助的。在全文结构上我尽量使问题连贯地形成知识体系,而不是堆积的碎片,而且,每个问题我会尽量地给出答案。
另一方面,我希望,有大佬可以指出我的错误。因为我的答案不一定对,尤其那些带 * 的问题。
这份资料将会持续更新,如果有其他问题也可以留言讨论。欢迎交流,共同进步。
修改时间 | 版本 | 修改人 | 修改内容 | 问题答案 |
---|---|---|---|---|
2022-05-02 | 1.0.0 | ZhangZiSheng001 | 初始化 | 我的JAVA面试题备忘录1.0.0.pdf.zip |
2022-12-04 | 1.0.1 | ZhangZiSheng001 | 更正SQL和NOSQL的区别 | 我的JAVA面试题备忘录1.0.1.pdf.zip |
JDK
JVM
class文件的组成结构
说说JVM的运行时数据区
CompressedClassSpace是干嘛用的
运行时常量池和字符串常量池的区别
Minor GC、Major GC和Full GC的区别
一次完整的GC流程是怎样的
什么时候触发major gc
什么是分配担保机制
对象什么时候晋升到老年代
有哪几种垃圾回收算法
有哪几种垃圾回收器
怎么手动触发gc
新生代和老年代比例多大比较好*
字符串常量池会gc吗
MetaSpace会gc吗
项目里用到的JVM参数
项目中JVM调优的例子*
运行时能不能调整堆大小*
类加载器
说说类的加载过程
什么是双亲委派机制
为什么要有多个类加载器
为什么会有双亲委派机制
为什么破坏双亲委派机制
Class.forName和ClassLoader.loadClass的区别
自定义java.lang.String可以吗
JUC
线程和进程的区别
线程有哪几个状态?它们如何转换的
如何中止一个线程
异步线程的异常怎么处理*
什么是线程池?说说它的原理
Executors的几种线程池
线程池的关闭方式
你们项目怎么用线程池*
线程池设置多大合适*
ThreadLocal有什么用
使用ThreadLocal需要注意的问题
volatile的作用
什么是乐观锁、悲观锁
CAS的作用
CAS的缺点
什么是 AQS
什么是独占锁、共享锁
什么是公平锁、非公平锁
synchronized原理、优化
CyclicBarrier与CountDownLatch区别
三种等待/唤醒的使用和区别
Object.notify和Condition.signal是随机唤醒线程吗
如何保证多个线程顺序执行
用三个线程按顺序循环打印abc三个字母
不sleep(0)和sleep(0)的区别
容器
说说常用的几个容器
为什么HashMap的数组是2的n次方
为什么链表大于8且size大于64才转红黑树*
红黑树转回链表的阈值为什么是6不是8
扩容因子为什么是0.75
HashMap和ConcurrentHashMap的区别
TreeMap的使用场景*
ConcurrentHashMap为什么放弃分段锁
DelayQueue的原理
Collections.synchronizedMap本质
异常
Error和Exception的区别
RuntimeException和其他Exception的区别*
其他
String.length() 总是可靠吗
static方法可以重写吗
类的实例化顺序
redis
为什么要使用缓存
redis为什么快
redis为什么使用单线程
为什么redis6.0又用了多线程
说说redis的数据结构
redis还可以做什么
redis有哪种持久化
项目中使用哪种持久化?为什么
说说redis的高可用架构
为什么Cluster模式不用一致性哈希,而是用哈希槽
怎么解决一致性问题*
redis的过期策略
redis的淘汰策略
缓存穿透、缓存击穿、缓存雪崩、热key
如何解决双写不一致问题
说说分布式锁原理
如何避免多客户端获得同一把锁
超时时间大小设置的依据是什么*
如何实现一个列表中元素不同过期时间
mysql
为什么要用数据库
为什么要用mysql*
关系型数据库和非关系型的区别
SQL和NOSQL怎么选择
为什么查询那么快
什么是B+树
hash索引和B+树索引的区别
聚簇索引和非聚簇索引的区别
组合索引生效规则
复合索引的索引树是怎样的*
怎么判断索引是否生效
重复性高的字段都不能加索引吗
项目中有没遇到慢查询?怎么办
sql的执行顺序
exists和in的区别
count(*)、count(字段) 和count(1)区别
为什么select count(*)在myisam比Innodb快
什么是事务
脏读、不可重复读、幻读的原因和解决方案
什么是MVCC
RR级别能否解决幻读
gap锁和next-key锁的关系
next-key的一些示例
为什么要有意向锁
MyISAM 和 InnoDB 的区别
如何解决死锁*
MVCC下delete的数据会一直存在吗
为什么分库分表
怎么分库分表
有哪些分库分表方案
mysql的主从复制方式
mysql的高可用方案*
主从不一致怎么解决
队列
为什么使用队列
为什么要用RabbitMQ*
项目里怎么用的
AMQP的协议模型
RabbitMQ的两种模式
RabbitMQ的四种交换机
routingkey和bindingkey的区别
如何保证消息有序*
如何保证消息不丢失
怎么保证消费幂等性
如何避免队列消息积压
如何做延迟队列
重回队列的消息排在哪里
RabbitMQ的高可用方案
生产者创建队列还是消费者创建队列
死信交换(DLX)和死信队列(DLQ)
推模式和拉模式
spring
IOC和DI的理解
beanFactory和applicationContext的区别
如何解决循环依赖
什么情况会出现无法解析的循环依赖?为什么
bean的生命周期
事务传播机制
Spring Cloud中feign、ribbon和hystrix的超时时间
springboot自动装配的过程
微服务
为什么要用微服务
为什么要使用集群而不是更好的单机
什么是CAP
什么是Service Mesh*
什么是降级
几种限流算法
分布式事务*
分布式id
oauth2.0
eureka、ribbon、hystrix是如何配合的*
你们项目的日活、qps是多少
怎么统计qps
正向代理和反向代理的区别
如何实现热部署*
你们项目的监控告警
Counter、Gauge、Summary、Histogram的区别
链路
操作系统
Linux的IO模型有哪几种
reactor模型有哪几种
epoll和poll的区别
平时用到的Linux命令
一个进程最多可以创建多少线程
故障排查
为什么 java 程序的内存溢出往往伴随着 CPU 爆表
CPU爆表怎么排查
内存高怎么排查
线上系统突然变得异常缓慢,如何排查*
网络
网络:集线器、交换机、路由器
为什么是三次握手?最后一次省略不行吗
为什么是四次挥手?第二次和第三次合并不行吗?最后一次省略不行吗
TCP四次挥手为什么要等待2msl
http和https的区别
说几个HTTP状态码
当你用浏览器打开一个链接的时候,计算机做了哪些工作步骤
如何避免浏览器缓存
如何理解HTTP协议的无状态性
HTTP有哪几种method
算法
雪花算法
雪花算法如何解决时钟回拨
一致性哈希算法
对称加密、非对称加密算法
时间轮算法
解决hash冲突的方法
paxos算法*
raft算法*
设计
设计模式
手写单例模式
代理模式和装饰模式的区别
面向对象设计的原则
如何设计一个良好的API
数据库设计的三大范式
开发、设计中遇到的问题或挑战
什么是MVC
场景题
实现:抢红包
实现:扫码登录
实现:秒杀*
实现:多少人在看这篇文章*
实现:浏览过这篇文章的还浏览了
实现:附近的人
实现:五亿数据,找出数量top100
实现:并发安全的链表*
实现:30分钟没付款就自动关闭交易
实现:分布式环境下的countDownLatch
其他
长链接转短链接的原理
tomcat的并发控制参数
结语
感谢阅读。
打赏支持 ~
本文为原创文章,转载请附上原文出处链接:https://www.cnblogs.com/ZhangZiSheng001/p/16218179.html