我的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

posted @ 2022-05-03 17:58  子月生  阅读(636)  评论(0编辑  收藏  举报