Java面试题分类总结

186 阅读14分钟

Java面试题类型归纳

笼统问题

个人规划相关
  1. 对个人职业有什么规划?
  2. 为什么从上一家公司离职?
技术相关
  1. 最近做过的最有挑战的项目,有哪些难点?
  2. 结合项目细聊系统的设计,根据你的设计提出疑问。
  3. 详细聊项目经历
  4. 线上服务接口非常慢?如何排查?
  5. 如何设计一个秒杀系统?在双十一当天,从浏览器中输入 www.taobao.com 到加载出页面,说一下它的完整过程。

算法

  1. 图这种数据结构了解吗?如何判断图中是否有环?
  2. 如何找出图中所有的环?
  3. 说下哈希一致性算法?

设计模式

  1. 熟悉哪些设计模式?在项目中哪些地方实际使用过?

Java

基础
  1. Java 中使用的是值传递还是引用传递?
  2. 方法调用时入参是如何传递的?
  3. Java 中反射的基本原理?实际项目中是如何使用反射的?
容器
  1. List 集合哪些?ArrayList 和 LinkedList 的区别和使用场景?为什么?
  2. HashMap 的实现原理?1.7 和 1.8 的区别?
  3. HashMap 中的 hash 算法?这样的 hash 算法有什么好处(高低 16 位均参与运算)?如何寻址?
  4. Java 中有哪些线程安全的 Map?
IO
  1. 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 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。

  2. 同步/异步、阻塞/非阻塞的概念
    • 同步、异步(从调用者角度出发

      • 同步:需要等待结果返回,才能继续运行
      • 异步:不需要等待结果返回,就能继续运行
    • 阻塞、非阻塞(从被调用系统 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

索引
  1. MySQL 数据库索引的实现原理?
  2. 什么是回表?什么是联合索引?什么是最左前缀匹配原则?
  3. MySQL 索引的数据结构是什么?为什么选择这种数据结构?
  4. B+Tree 和 B-Tree 有什么区别?
  5. 数据库的索引是不是创建得越多越好?为什么?通常创建几个?
  6. 一张表中对 a、b、c 三个字段分别建立了索引,现在有一条 SQL 语句:select field1,field2 ... from t where a = xx and b=xx and c=xx. 请问这条 SQL 语句会使用到索引吗?如果会,那么会使用到哪个索引?(回答:只会使用其中一个索引,可能是 a,也可能是 b,还有可能是 c,具体使用哪个索引和表中的数据有关)
  7. 为什么不会同时使用 a,b,c 三个索引?什么是回表?
  8. 聚簇索引和非聚簇索引的区别?
  9. 如何知道一条 SQL 语句使用了哪些索引?(回答:使用 explain 查看)
  10. MySQL 为什么使用 B+树来作索引,对比 B 树它的优点和缺点是什么?
  11. MySQL 的索引为什么是 B+Tree,而不是数组、Hash 之类的数据结构?为什么不是 B-Tree?
  12. MySQL 索引的数据结构和原理?
事务
  1. MySQL 存储引擎的区别?数据库有哪些隔离级别?
  2. MySQL 是如何解决不可重复读问题的?
  3. MVCC 的实现原理
  4. MySQL 的可重复读隔离级别下,存在幻读吗?为什么?
  5. 数据库有哪些隔离级别?这几种隔离级别分别解决了什么问题?
  6. MySQL 的 InnoDB 在可重复读隔离界别下如何解决不可重复读问题和幻读问题的?什么是快照读?什么是当前读?
  1. 线上数据库出现了死锁怎么办?
  2. MySQL 中有哪些锁?什么是间隙锁?
日志与主备
  1. MySQL 中有哪些日志?
  2. 数据库有哪些特性?MySQL 是如何保证机器宕机重启后,数据不丢失的?
  3. binlog 有什么作用?将其格式设置为 statement 会有什么问题?你们线上是如何配置的?
主从复制
  1. 如何保证 MySQL 的高可用?主从复制的原理?
  2. 你们项目中是如何保证数据一致性的?
  3. 现在线上环境中发现 MySQL 的从节点大幅落后于 master 节点,可能是什么原因?如何处理?
临时表
分库分表
  1. 结合项目,分库分表该如何设计
其它
  1. explain 的结果有哪些列?分别代表什么含义?
  2. 如何查看 SQL 的慢查询日志?线上服务出现慢查询了怎么处理?
  3. 代码在执行 SQL 语句时,数据库连接出现了超时异常,但是你不知道这条 SQL 语句在数据库中究竟有没有执行成功,这种情况怎么保证数据的一致性?
  4. SQL 的优化经验?
  5. SQL 的优化经验有哪些?索引的设计准则?

JVM

内存结构
  1. JVM 中有哪些数据区域?
  2. 简述新生代与老年代的区别?
类加载机制
  1. 类的加载过程?什么是双亲委派机制?
  2. 类加载过程,以及方法的执行的过程?
垃圾回收
  1. JVM 如何进行垃圾回收?标记算法有哪些?垃圾回收算法有哪些?
  2. JVM 的垃圾回收机制?为什么要区分新生代、老年代?
  3. CMS 垃圾回收器的原理?
  4. JVM 的垃圾回收算法
  5. GC Roots 有哪些?
  6. 什么是三色标记?
  7. 线上 GC 有问题,如何排查?
  8. Java 如何判断一个对象能否被回收?垃圾回收算法有哪些?
  9. Java 中对象的引用有哪些类型?
  10. 垃圾标记算法和垃圾回收算法有哪些?
  11. 什么是三色标记?什么是安全点与安全区域?
  12. 简述一下 G1 垃圾回收器的原理?
  13. 什么时候会触发 Minor GC?什么时候触发 Old GC?什么是 Full GC?
  14. 对象什么时候进入到老年代?什么是动态年龄判断?
  15. 你们线上服务的 QPS 有多大?机器配置是多少?JVM 的参数是怎么设置的?GC 的频率?为什么要这这样配置?
内存模型
  1. 什么是 JMM 内存模型?
  2. 什么是原子性、可见性、有序性?什么是 happen-before 原则?解释一下 final 的语义?
其它
  1. JVM 调优经验?
  2. 一个对象是如何存储在 JVM 中的?
  3. 对象在内存中的布局?

多线程

共享模型-管程
  1. 什么是线程安全?
  2. Java 中锁有哪些?synchronize 和 Lock 的区别?
  3. synchronized 的底层实现原理?
  4. volatile 的作用和实现原理?
  5. Lock 系列锁的实现原理?
共享模型-内存模型
  1. 什么是原子性、可见性、有序性?什么是 happen-before 原则?解释一下 final 的语义?
共享模型-无锁
  1. 什么是 CAS?CAS 存在什么问题?
  2. 什么是原子类?原子类的实现原理?
ThreadLocal
  1. ThreadLocal 的实现原理?存在什么问题?如何避免?
  2. 使用 ThreadLocal 需要注意哪些问题?(实际上是问 ThreadLocal 内存泄漏的问题)
JUC
  1. AQS 实现锁的原理?与 synchronize 的区别?
  2. ConcurrentHashMap 的实现原理?
  3. CucurrentHashMap 中 Node 节点是如何设计的?为什么要用 final 和 volatile 修饰 Node 节点的属性?有什么作用?
  4. ConcurrentHashMap 的实现原理?1.7 和 1.8 的区别?
  5. ConcurrentHashMap 如何统计元素的个数?会有什么问题?
线程池
  1. 线程池的实现原理?线程池满了,再提交任务时会怎么处理?
  2. 线程池的实现原理?有哪些参数,分别是什么含义?
  3. 线程池的实现原理是什么?如何设置线程池的参数?
  4. 对于 CPU 密集型的系统,为什么线程个数设置为 CPU 核数+1?为什么要+1?
  5. 对于 IO 密集型的系统,为什么线程个数为 2 倍 CPU 核数?为什么是 2 倍,而不是 3 倍、4 倍等等?

Spring

  1. 在 Spring 事务中执行多条 SQL 语句时,是对应多个数据库连接还是一个数据库连接?
    • A:一个连接,多个就无法保证事务了
  2. 既然是一个连接,Spring 在前后执行多条 SQL 时,是如何保证当前线程获取到同一个连接的?
    • A:ThreadLocal
  3. Spring 的 AOP 的使用场景?AOP 机制有什么好处?

Redis

数据类型
  1. Redis 有哪些数据类型?List 中数据非常多怎么办?
持久化
  1. redis 的持久化机制?AOF 和 RDB 的区别?
  2. redis 的数据持久化机制?如何保证数据不丢失?当 redis 内存满了以后,内存的淘汰策略?
  3. Redis 的持久化机制?AOF 和 RDB 的优缺点?
分布式相关
  1. 你们系统中分布式锁是如何实现的?(当时回答采用 redis 实现,set(key,value,nx,ex,expire))
  2. 上面使用 redis 实现分布式锁会存在什么问题?(如何用 Zookeeper 实现分布式锁?存在什么问题?)
  3. 项目中除了使用 redis 实现分布式锁,还有哪些使用场景?
  4. redis 实现分布式锁的原理?redis 的分布式锁有什么问题?lua 脚本熟悉吗?
  5. redis 分布式锁与 lua 脚本?
  6. redission 了解过吗?说说它的实现原理?
数据库和缓存一致性问题
  1. redis 和 MySQL 的双写一致性问题?你们是如何做的?为什么这样做?其他的做法会存在什么问题?
  2. redis 缓存和数据库数据一致性怎么解决?
主从复制
  1. Redis 主从复制的原理
内存淘汰
  1. redis 的内存淘汰策略?
高可用(集群和哨兵)
  1. 你们的 redis 使用的那种模式?集群模式和哨兵模式的区别?集群模式和哨兵模式如何保证 redis 集群的高可用?redis 集群的故障转移过程?
  2. Redis 的高可用怎么保证?线上有多少台机器?怎么部署的?
过期策略
  1. redis 中 key 的过期策略是什么?
  2. 如何解决热 key 问题?
  3. Redis 中遇到热 key 会造成什么问题?如何发现热 key?如何解决热 key 的问题?
击穿、雪崩、穿透
  1. 什么是缓存击穿、缓存穿透、缓存雪崩?如何处理?
其它
  1. redis 集群如何实现扩容?
  2. redis 的 rehash 的过程?

消息队列

  1. MQ 使用过哪些?如何选型?
  2. 让你设计一个 MQ,你会如何设计?
Kafka
  1. 如何保证消息的顺序性?
  2. 如何保证消息不被重复消费?
  3. 如何保证 Kafka 的高可用性?
  4. 线上 MQ 出现消息大量积压,应该如何处理?

网络

应用层
  1. Http 和 Https 的区别?
  2. 加密算法知道哪些?什么是对称加密?什么是非对称加密?
  3. 如何保证接口的安全性?应该使用什么加密策略?
传输层
  1. TCP 的三次握手和四次挥手?为什么是 3 次和 4 次?
  2. TCP 如何保证可靠传输?

RPC框架

  1. 使用的是什么 RPC 框架?为什么选择它?
  2. RPC 框架的选型?
  3. Motan 是如何实现负载均衡的?
  4. 微服务的技术选型?为什么选择 Motan?

微服务

注册中心
  1. 你们微服务的注册中心是如何选型的?Zookeeper 和 Eureka 作为注册中心的区别?它们有什么瓶颈?
  2. Zookeeper 作为注册中心的实现原理?
  3. Zookeeper 实现分布式锁的原理?
  4. Zookeeper 集群如何部署?Zookeeper 如何实现选举?什么是 ZAB 协议?
  5. Zookeeper 如何保证数据的顺序一致性?
  6. Zookeeper 的使用场景?如何支撑大量的读请求?
  7. 如何设计一款能支撑数十万机器组成的集群的注册中心?

分布式

  1. 你们的分布式系统中如何保证数据一致性问题?
  2. 客户端请求过来,后端如何防止重复请求,保证幂等?
  3. 如何保证分布式系统的强一致性?
  4. 分布式一致性协议(raft)原理
  5. 类似于淘宝这样的系统,你觉得他们的他们是如何实现数据的强一致性的?
分布式事务
  1. 分布式系统中,分布式事务怎么解决?(回答:RocketMQ 的事务消息)
  2. 分布式事务问题,CAP 理论?2PC、XA、TCC、MQ 等原理

Netty

  1. Reactor 线程模型有哪些?Netty 是如何支持这三种线程模型的?
  2. 多路复用器的实现原理?
  3. epoll 的实现原理?epoll、poll、select 的区别
  4. Netty 的线程模型?主从多线程模型下,线程是如何分工的?
  5. 什么是 TCP 的粘包与半包?Netty 是如何解决的?
  6. netty 用过吗?为什么 netty 是高性能的网络框架?
Linux
  1. 什么是 mmap?
  2. 零拷贝机制的实现原理?