Java面试题类型归纳
笼统问题
个人规划相关
- 对个人职业有什么规划?
- 为什么从上一家公司离职?
技术相关
- 最近做过的最有挑战的项目,有哪些难点?
- 结合项目细聊系统的设计,根据你的设计提出疑问。
- 详细聊项目经历
- 线上服务接口非常慢?如何排查?
- 如何设计一个秒杀系统?在双十一当天,从浏览器中输入 www.taobao.com 到加载出页面,说一下它的完整过程。
算法
- 图这种数据结构了解吗?如何判断图中是否有环?
- 如何找出图中所有的环?
- 说下哈希一致性算法?
设计模式
- 熟悉哪些设计模式?在项目中哪些地方实际使用过?
Java
基础
- Java 中使用的是值传递还是引用传递?
- 方法调用时入参是如何传递的?
- Java 中反射的基本原理?实际项目中是如何使用反射的?
容器
- List 集合哪些?ArrayList 和 LinkedList 的区别和使用场景?为什么?
- HashMap 的实现原理?1.7 和 1.8 的区别?
- HashMap 中的 hash 算法?这样的 hash 算法有什么好处(高低 16 位均参与运算)?如何寻址?
- Java 中有哪些线程安全的 Map?
IO
-
BIO、NIO、AIO 的区别?
-
BIO:传统的 java.io 包,它是基于流模型实现的,交互的方式是同步阻塞方式,也就是说在读入输入流或者输出流时,在读写动作完成之前,线程会一直阻塞在那里,它们之间的调用时可靠的线性顺序。它的有点就是代码比较简单、直观;缺点就是 IO 的效率和扩展性很低,容易成为应用性能瓶颈。
-
NIO:Java 1.4 引入的 java.nio 包,提供了 Channel、Selector、Buffer 等新的抽象,可以构建多路复用的、同步非阻塞 IO 程序,同时提供了更接近操作系统底层高性能的数据操作方式。
-
AIO:Java 1.7 之后引入的包,是 NIO 的升级版本,提供了异步非堵塞的 IO 操作方式,所以人们叫它 AIO(Asynchronous IO),异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。
-
-
同步/异步、阻塞/非阻塞的概念
-
同步、异步(从调用者角度出发)
- 同步:需要等待结果返回,才能继续运行
- 异步:不需要等待结果返回,就能继续运行
-
阻塞、非阻塞(从被调用系统 CPU 执行的角度出发)
- 阻塞:CPU 停下来等待一个慢的操作完成 CPU 才接着完成其它的事;
- 非阻塞:在这个慢的操作在执行时 CPU 去干其它别的事,等这个慢的操作完成时,CPU 再接着完成后续的操作。
- 总结:非阻塞的方式可以明显的提高 CPU 的利用率,但是也带了另外一种后果就是系统的线程切换增加。增加的 CPU 使用时间能不能补偿系统的切换成本需要好好评估。
-
同/异、阻/非堵塞 组合
-
组合方式 性能分析 同步阻塞 Java的基础IO;性能一般很差,CPU 大部分在空闲状态。 同步非阻塞 提升 I/O 性能的常用手段,就是将 I/O 的阻塞改成非阻塞方式,尤其在网络 I/O 是长连接,同时传输数据也不是很多的情况下,提升性能非常有效。 这种方式通常能提升 I/O 性能,但是会增加CPU 消耗,要考虑增加的 I/O 性能能不能补偿 CPU 的消耗,也就是系统的瓶颈是在 I/O 还是在 CPU 上。 异步阻塞 这种方式在分布式数据库中经常用到,例如在网一个分布式数据库中写一条记录,通常会有一份是同步阻塞的记录,而还有两至三份是备份记录会写到其它机器上,这些备份记录通常都是采用异步阻塞的方式写 I/O。异步阻塞对网络 I/O 能够提升效率,尤其像上面这种同时写多份相同数据的情况。 异步非阻塞 这种组合方式用起来比较复杂,只有在一些非常复杂的分布式情况下使用,像集群之间的消息同步机制一般用这种 I/O 组合方式。如 Cassandra 的 Gossip 通信机制就是采用异步非阻塞的方式。它适合同时要传多份相同的数据到集群中不同的机器,同时数据的传输量虽然不大,但是却非常频繁。这种网络 I/O 用这个方式性能能达到最高。
-
-
MySQL
索引
- MySQL 数据库索引的实现原理?
- 什么是回表?什么是联合索引?什么是最左前缀匹配原则?
- MySQL 索引的数据结构是什么?为什么选择这种数据结构?
- B+Tree 和 B-Tree 有什么区别?
- 数据库的索引是不是创建得越多越好?为什么?通常创建几个?
- 一张表中对 a、b、c 三个字段分别建立了索引,现在有一条 SQL 语句:select field1,field2 ... from t where a = xx and b=xx and c=xx. 请问这条 SQL 语句会使用到索引吗?如果会,那么会使用到哪个索引?(回答:只会使用其中一个索引,可能是 a,也可能是 b,还有可能是 c,具体使用哪个索引和表中的数据有关)
- 为什么不会同时使用 a,b,c 三个索引?什么是回表?
- 聚簇索引和非聚簇索引的区别?
- 如何知道一条 SQL 语句使用了哪些索引?(回答:使用 explain 查看)
- MySQL 为什么使用 B+树来作索引,对比 B 树它的优点和缺点是什么?
- MySQL 的索引为什么是 B+Tree,而不是数组、Hash 之类的数据结构?为什么不是 B-Tree?
- MySQL 索引的数据结构和原理?
事务
- MySQL 存储引擎的区别?数据库有哪些隔离级别?
- MySQL 是如何解决不可重复读问题的?
- MVCC 的实现原理
- MySQL 的可重复读隔离级别下,存在幻读吗?为什么?
- 数据库有哪些隔离级别?这几种隔离级别分别解决了什么问题?
- MySQL 的 InnoDB 在可重复读隔离界别下如何解决不可重复读问题和幻读问题的?什么是快照读?什么是当前读?
锁
- 线上数据库出现了死锁怎么办?
- MySQL 中有哪些锁?什么是间隙锁?
日志与主备
- MySQL 中有哪些日志?
- 数据库有哪些特性?MySQL 是如何保证机器宕机重启后,数据不丢失的?
- binlog 有什么作用?将其格式设置为 statement 会有什么问题?你们线上是如何配置的?
主从复制
- 如何保证 MySQL 的高可用?主从复制的原理?
- 你们项目中是如何保证数据一致性的?
- 现在线上环境中发现 MySQL 的从节点大幅落后于 master 节点,可能是什么原因?如何处理?
临时表
分库分表
- 结合项目,分库分表该如何设计
其它
- explain 的结果有哪些列?分别代表什么含义?
- 如何查看 SQL 的慢查询日志?线上服务出现慢查询了怎么处理?
- 代码在执行 SQL 语句时,数据库连接出现了超时异常,但是你不知道这条 SQL 语句在数据库中究竟有没有执行成功,这种情况怎么保证数据的一致性?
- SQL 的优化经验?
- SQL 的优化经验有哪些?索引的设计准则?
JVM
内存结构
- JVM 中有哪些数据区域?
- 简述新生代与老年代的区别?
类加载机制
- 类的加载过程?什么是双亲委派机制?
- 类加载过程,以及方法的执行的过程?
垃圾回收
- JVM 如何进行垃圾回收?标记算法有哪些?垃圾回收算法有哪些?
- JVM 的垃圾回收机制?为什么要区分新生代、老年代?
- CMS 垃圾回收器的原理?
- JVM 的垃圾回收算法
- GC Roots 有哪些?
- 什么是三色标记?
- 线上 GC 有问题,如何排查?
- Java 如何判断一个对象能否被回收?垃圾回收算法有哪些?
- Java 中对象的引用有哪些类型?
- 垃圾标记算法和垃圾回收算法有哪些?
- 什么是三色标记?什么是安全点与安全区域?
- 简述一下 G1 垃圾回收器的原理?
- 什么时候会触发 Minor GC?什么时候触发 Old GC?什么是 Full GC?
- 对象什么时候进入到老年代?什么是动态年龄判断?
- 你们线上服务的 QPS 有多大?机器配置是多少?JVM 的参数是怎么设置的?GC 的频率?为什么要这这样配置?
内存模型
- 什么是 JMM 内存模型?
- 什么是原子性、可见性、有序性?什么是 happen-before 原则?解释一下 final 的语义?
其它
- JVM 调优经验?
- 一个对象是如何存储在 JVM 中的?
- 对象在内存中的布局?
多线程
共享模型-管程
- 什么是线程安全?
- Java 中锁有哪些?synchronize 和 Lock 的区别?
- synchronized 的底层实现原理?
- volatile 的作用和实现原理?
- Lock 系列锁的实现原理?
共享模型-内存模型
- 什么是原子性、可见性、有序性?什么是 happen-before 原则?解释一下 final 的语义?
共享模型-无锁
- 什么是 CAS?CAS 存在什么问题?
- 什么是原子类?原子类的实现原理?
ThreadLocal
- ThreadLocal 的实现原理?存在什么问题?如何避免?
- 使用 ThreadLocal 需要注意哪些问题?(实际上是问 ThreadLocal 内存泄漏的问题)
JUC
- AQS 实现锁的原理?与 synchronize 的区别?
- ConcurrentHashMap 的实现原理?
- CucurrentHashMap 中 Node 节点是如何设计的?为什么要用 final 和 volatile 修饰 Node 节点的属性?有什么作用?
- ConcurrentHashMap 的实现原理?1.7 和 1.8 的区别?
- ConcurrentHashMap 如何统计元素的个数?会有什么问题?
线程池
- 线程池的实现原理?线程池满了,再提交任务时会怎么处理?
- 线程池的实现原理?有哪些参数,分别是什么含义?
- 线程池的实现原理是什么?如何设置线程池的参数?
- 对于 CPU 密集型的系统,为什么线程个数设置为 CPU 核数+1?为什么要+1?
- 对于 IO 密集型的系统,为什么线程个数为 2 倍 CPU 核数?为什么是 2 倍,而不是 3 倍、4 倍等等?
Spring
- 在 Spring 事务中执行多条 SQL 语句时,是对应多个数据库连接还是一个数据库连接?
- A:一个连接,多个就无法保证事务了
- 既然是一个连接,Spring 在前后执行多条 SQL 时,是如何保证当前线程获取到同一个连接的?
- A:ThreadLocal
- Spring 的 AOP 的使用场景?AOP 机制有什么好处?
Redis
数据类型
- Redis 有哪些数据类型?List 中数据非常多怎么办?
持久化
- redis 的持久化机制?AOF 和 RDB 的区别?
- redis 的数据持久化机制?如何保证数据不丢失?当 redis 内存满了以后,内存的淘汰策略?
- Redis 的持久化机制?AOF 和 RDB 的优缺点?
分布式相关
- 你们系统中分布式锁是如何实现的?(当时回答采用 redis 实现,set(key,value,nx,ex,expire))
- 上面使用 redis 实现分布式锁会存在什么问题?(如何用 Zookeeper 实现分布式锁?存在什么问题?)
- 项目中除了使用 redis 实现分布式锁,还有哪些使用场景?
- redis 实现分布式锁的原理?redis 的分布式锁有什么问题?lua 脚本熟悉吗?
- redis 分布式锁与 lua 脚本?
redission 了解过吗?说说它的实现原理?
数据库和缓存一致性问题
- redis 和 MySQL 的双写一致性问题?你们是如何做的?为什么这样做?其他的做法会存在什么问题?
- redis 缓存和数据库数据一致性怎么解决?
主从复制
- Redis 主从复制的原理
内存淘汰
- redis 的内存淘汰策略?
高可用(集群和哨兵)
- 你们的 redis 使用的那种模式?集群模式和哨兵模式的区别?集群模式和哨兵模式如何保证 redis 集群的高可用?redis 集群的故障转移过程?
- Redis 的高可用怎么保证?线上有多少台机器?怎么部署的?
过期策略
- redis 中 key 的过期策略是什么?
- 如何解决热 key 问题?
- Redis 中遇到热 key 会造成什么问题?如何发现热 key?如何解决热 key 的问题?
击穿、雪崩、穿透
- 什么是缓存击穿、缓存穿透、缓存雪崩?如何处理?
其它
- redis 集群如何实现扩容?
- redis 的 rehash 的过程?
消息队列
- MQ 使用过哪些?如何选型?
- 让你设计一个 MQ,你会如何设计?
Kafka
- 如何保证消息的顺序性?
- 如何保证消息不被重复消费?
- 如何保证 Kafka 的高可用性?
- 线上 MQ 出现消息大量积压,应该如何处理?
网络
应用层
- Http 和 Https 的区别?
- 加密算法知道哪些?什么是对称加密?什么是非对称加密?
- 如何保证接口的安全性?应该使用什么加密策略?
传输层
- TCP 的三次握手和四次挥手?为什么是 3 次和 4 次?
- TCP 如何保证可靠传输?
RPC框架
- 使用的是什么 RPC 框架?为什么选择它?
- RPC 框架的选型?
- Motan 是如何实现负载均衡的?
- 微服务的技术选型?为什么选择 Motan?
微服务
注册中心
- 你们微服务的注册中心是如何选型的?Zookeeper 和 Eureka 作为注册中心的区别?它们有什么瓶颈?
- Zookeeper 作为注册中心的实现原理?
- Zookeeper 实现分布式锁的原理?
- Zookeeper 集群如何部署?Zookeeper 如何实现选举?什么是 ZAB 协议?
- Zookeeper 如何保证数据的顺序一致性?
- Zookeeper 的使用场景?如何支撑大量的读请求?
- 如何设计一款能支撑数十万机器组成的集群的注册中心?
分布式
- 你们的分布式系统中如何保证数据一致性问题?
- 客户端请求过来,后端如何防止重复请求,保证幂等?
- 如何保证分布式系统的强一致性?
- 分布式一致性协议(raft)原理
- 类似于淘宝这样的系统,你觉得他们的他们是如何实现数据的强一致性的?
分布式事务
- 分布式系统中,分布式事务怎么解决?(回答:RocketMQ 的事务消息)
- 分布式事务问题,CAP 理论?2PC、XA、TCC、MQ 等原理
Netty
- Reactor 线程模型有哪些?Netty 是如何支持这三种线程模型的?
- 多路复用器的实现原理?
- epoll 的实现原理?epoll、poll、select 的区别
- Netty 的线程模型?主从多线程模型下,线程是如何分工的?
- 什么是 TCP 的粘包与半包?Netty 是如何解决的?
- netty 用过吗?为什么 netty 是高性能的网络框架?
Linux
- 什么是 mmap?
- 零拷贝机制的实现原理?