开发两年拿下阿里P6的offer,只因靠这位大佬总结的Java面试题总集
前言
Java面试随着时间的改变而改变。在过去的日子里,当你知道 String 和 StringBuilder 的区别就能让你直接进入第二轮面试,但是现在问题变得越来越高级,面试官问的问题也更深入。 在我初入职场的时候,类似于 Vector 与 Array 的区别、HashMap 与 Hashtable 的区别是最流行的问题,只需要记住它们,就能在面试中获得更好的机会,但这种情形已经不复存在。如今,你将会被问到许多 Java 程序员都没有看过的领域,如 NIO,设计模式,成熟的单元测试,或者那些很难掌握的知识,如并发、算法、数据结构及编码。
由于我喜欢研究面试题,因此我已经收集了许多的面试问题,包括许多许多不同的主题。我已经为这众多的问题准备一段时间了,现在我将它们分享给你们。这里面不但包含经典的面试问题,如线程、集合、equals 和 hashcode、socket,而且还包含了 NIO、数组、字符串、Java 8 等主题。
该列表包含了入门级 Java 程序员和多年经验的高级开发者的问题。无论你是 1、2、3、4、5、6、7、8、9 还是 10 年经验的开发者,你都能在其中找到一些有趣的问题。这里包含了一些超级容易回答的问题,同时包含经验丰富的 Java 程序员也会棘手的问题。
该问题列表特别长,我们有各个地方的问题,所以,答案必须要短小、简洁、干脆,不拖泥带水。因此,除了这一个段落,你只会听到问题与答案,再无其他内容,没有反馈,也没有评价。为此,我已经写好了一些博文,在这些文章中你可以找到我对某些问题的观点,如我为什么喜欢这个问题,这个问题的挑战是什么?期望从面试者那获取到什么样的答案?
这个列表有一点不同,我鼓励你采用类似的方式去分享问题和答案,这样容易温习。我希望这个列表对面试官和候选人都有很好的用处,面试官可以对这些问题上做一些改变以获取新奇和令人惊奇的元素,这对一次好的面试来说非常重要。而候选者,可以扩展和测试 Java 程序语言和平台关键领域的知识。
一. Java基础
- 请你解释为什么会出现 4.0 - 3.6=0.40000001 这种现象
- 请你讲讲一个十进制的数在内存中是怎么存的?
- 接口和抽象类的区别是什么 ?
- HTTP请求的GET与POST方式的区别
- Session与Cookie区别
- 列出自己常用的JDK包
- equals与==的区别
- hashCode和equals方法的区别与联系
- 什么是Java序列化和反序列化,如何实现Java序列化?或者请解释Serializable 接口的作用
- Object类中常见的方法,为什么wait notify会放在Object里边?
- 解释一下extends 和super泛型限定符
- 请列举你所知道的Object类的方法并简要说明
- 创建线程的方式
- 自定义注解
- ArrayList扩容机制是怎么样的? 详细说一下。
- HashMap 1.7 和 1.8 的区别
- HashMap 初始容量 计算方法
- HashMap在并发下会产生什么问题?有什么替代方案?(HashTable, ConcurrentHashMap)。它们两者的实现原理。
- 手写HashMap
- HashMap在并发下会产生什么问题?有什么替代方案?(HashTable, ConcurrentHashMap)。它们两者的实现原理。
- HashMap 为什么不用平衡树,而用红黑树
二. Java并发
- ThreadLocal 子类及原理, OOM产生原因及防治
- 并发队列
- ThreadPoolExecutor构造函数有哪几个参数,实现原理,创建线程池的方式
- Executors 可以创建的线程池类型
- 线程池的阻塞队列为什么都用LinkedBlockingQueue,而不用ArrayBlockingQueue
- 为什么建议在不用线程池的时候,关闭线程池,线程池的作用就是复用线程
- CountDownLatch原理、CyclicBarrier原理,两者区别
- 如何实现一个生产者与消费者模型
三. 锁
- Synchronized原理
- synchronized和Lock的区别
- 什么是死锁
- 如何 避免死锁
- 什么是活锁
- synchronized 可重入是怎么实现的
- ReentrantLock可重入性怎么实现的?
- 非公平锁和公平锁在ReetrantLock里的实现过程是怎样的
- 自旋锁、自适应自旋、锁消除、锁粗化、轻量级锁、偏向锁
- 公平锁、非公平锁
- AbstractQueuedSynchronizer的作用
- JDK8新增的锁
四. JVM知识
- JVM运行时内存区域划分
- OOM,及SOE的示例、原因,排查方法
- 如何判断对象可以回收或存活
- 哪些对象可以作为GC ROOT 对象
- 常见的GC算法
- 常见的JVM性能监测分析工具
- JVM优化
- 什么时候会触发FullGC
- 类加载器有几种
- 什么是双亲委派模型?双亲委派模型的破坏
- 类的生命周期
- 强引用、软引用、弱引用、虚引用
- 编译器会对指令做哪些优化?
五. Java反射IO
- 请说明如何通过反射获取和设置对象私有字段的值?
- BIO、NIO区别
- Java NIO的原理
六. 设计模式
- 常见的设计模式
- 单例模式代码
七. 数据结构
- 如何构造一致性哈希算法
- 二叉树结构
- 平衡二叉树(AVL)
- 红黑树
- B+树 和 B-树
八. 数据库
- 数据库三大范式、反模式
- Mysql 架构图
- InnoDB存储结构
- 存储引擎的 InnoDB与MyISAM区别,优缺点,使用场景
- 建立索引的原则
- B+Tree 索引 和 哈希索引 限制
九. Redis
- Redis 为什么是单线程? 为什么单线程还能这么快?
- Redis 使用场景
- Redis 持久化机制
- Redis 数据类型
- 事务
- Redis高可用方案
十. Spring
- BeanFactory 与ApplicationContext 是干什么的,两者的区别
- Spring IOC容器如何实现
- Spring DI(依赖注入)的实现
- Spring如何解决循环依赖问题
- Spring Bean 生命周期
- Spring Bean的作用域,默认是哪个?
十一. Spring Boot
- 什么是 Spring Boot?
- Spring Boot启动流程
- Spring Boot启动的时候会加载哪些包?
- 如何重新加载 Spring Boot 上的更改,而无需重新启动服务器?
- 什么是 Spring Boot 自动配置?
十二. Dubbo
- Dubbo SPI的理解
- Dubbo 基本原理、执行流程
- Dubbo 负载均衡策略、集群策略
- 注册中心挂了还可以通信吗?
十三. Spring Cloud
- 什么是Spring Cloud ?
- 使用Spring Cloud有什么优势?
- 服务注册和发现是什么意思? Spring Cloud如何实现?
- 负载平衡的意义什么?
- 什么是Hystrix ?它如何实现容错?
- 什么是Hystrix断路器?我们需要它吗?
十四. 消息队列
- 消息的幂等性处理思路
- 消息队列如何保证高可用
- 如何保证消息可靠性
- 消息积压问题
- kafka的分区策略
十五. Mybatis
- MyBatis 如何执行批量插入?
- 简述 Mybatis 的 XML 映射文件和 Mybatis 内部数据结构之间的映射关系?
- 通常一个 XML 映射文件,都会写一个 Mapper 接口与之对应。请问,这个 Mapper 接口的工作原理是什么?Mapper 接口里的方法,参数不同时,方法能重载吗?
十六. Zookeeper
- Zookeeper 是什么?
- Zookeeper 有哪几种节点类型?
- Zookeeper 的通知机制是什么?
- Zookeeper 采用什么权限控制机制?
- 集群中的机器角色有哪些?
- 集群支持动态添加机器吗
十七. Maven
- maven依赖 生命周期
十八. 场景题
- 假设一个场景,要求stop the world时间非常短,你会怎么设计垃圾回收机制?
- 现在有一个A类,其中有A、B、C方法,C方法中调用了A、B,定义了一个A、B方法的日志切面,请问能打印出日志吗?
十九. 分布式、微服务
- 领域驱动有了解吗?什么是领域驱动模型?
- JWT有了解吗,什么是JWT
- 说说如何设计一个良好的 API
- 说说 CAP 定理、BASE 理论
- 微服务与 SOA 的区别
- 说说分布式一致性的实现方案
二十. Java性能优化专题
- 性能分析的方法
- 收集系统、jvm信息
- 堆大小设置
- 回收器选择
- 响应时间优先的并发收集器
- 调优总结