Java 面试指南
2021-03-25 20:07:56 0 举报
AI智能生成
修炼内功
作者其他创作
大纲/内容
周一
Java基础
面向对象特性
封装
多态
继承
JVM、JDK 和 JRE 的区别
Java 和 C++ 的区别(4点)
泛型,类型擦除
反射原理以及优缺点
static、final 关键字
String、StringBuilder、StringBuffer 底层实现以及区别
String
StringBuilder
非线程安全
继承自 AbstractStringBuilder
String 可变
StringBuffer
线程安全
同样继承自 AbstractStringBuilder
String 可变
总结
Object 类的方法(11 个)
== 和 equals 的区别
为什么重写 equals() 方法必须要重写 hashCode() 方法
final、finally、finalize() 的区别
接口和抽象类的区别
重写和重载的区别
构造方法的特点
Java 异常
继承树(图)
异常处理
try 块
catch 块
finally 块
静态方法和实例方法
成员变量和局部变量
自动装箱和拆箱
BIO、NIO、AIO
深拷贝、浅拷贝
序列化
什么是序列化和反序列化
为什么要序列化
字段不想序列化
Java集合
List、Set、Map 集合对比
ArrayList
特点,使用场景
底层数据结构
扩容机制
线程是否安全
对比 Vector、LinkedList
LinkedList
特点,使用场景
底层数据结构
是否线程安全
对比 ArrayList
Vector
特点,使用场景
底层数据结构
是否线程安全
对比 ArrayList
HashMap
特点,使用场景
底层数据结构(JDK1.7、JDK1.8)
扩容机制(默认大小、什么时候扩容、扩容多少、如何扩容)
为什么链表长度为 8 时才使用红黑树
红黑树的特点
加载因子为什么是 0.75
是否线程安全
JDK1.7 并发情况下会产生什么问题
为什么 JDK1.7 采用头插法,JDK1.8 采用尾插法
如何解决哈希冲突
为什么长度要求数组长度为 2ⁿ
HashSet
特点,使用场景
底层数据结构
如何检查重复
对比 HashMap
HashTable
底层数据结构
是否线程安全, 线程安全实现方式
对比 HashMap
ConcurrentHashMap
底层数据结构(JDK1.7、JDK1.8)
实现线程安全方式
JDK1.7:ReentrantLock
JDK1.8:CAS+Sychronized
对比 HashTable
周二
JUC
线程
什么是线程、进程、协程
并发和并行的区别
多线程带来的问题
什么是线程安全
什么是上下文切换
线程的生命周期和状态
新建
运行(调用 start 方法)
阻塞(获取锁)
等待(调用 wait() 方法)
超时等待(调用 sleep() 方法)
终止
三种线程初始化方法(Thread、Callable、Runnable)的区别
线程池
什么是线程池,有什么好处(3 点)
降低资源消耗
提高响应速度
提高线程的可管理性
ThreadPoolExecutor
7 大参数
corePoolSize
maximumPoolSize
workQueue
keepAliveTime
unit
threadFactory
handler
4 种饱和策略
ThreadPoolExecutor.AbortPolicy(默认)
ThreadPoolExecutor.CallerRunsPolicy
ThreadPoolExecutor.DiscardPolicy
ThreadPoolExecutor.DiscardOldestPolicy
4 种线程池
CachedThreadPool
FixedThreadPool
SingleThreadExecutor
ScheduledThreadPool
有界、无界任务队列,手写 BlockingQueue
ThreadLocal
底层数据结构(ThreadLocalMap)
每个 Thread 中维护一个 ThreadLocalMap,在 ThreadLocalMap 中存放着以 ThreadLocal 为 key,要储存的信息为 val 的 Entry。
原理以及应用场景
为什么 ThreadLocalMap 的 key 为弱引用
内存泄漏问题
乐观锁:CAS
CAS 的原理
缺点
ABA 问题
解决方案
循环开销大
只能保证一个共享变量的原子性
手写一个 CAS
悲观锁:Synchronized
使用方法(静态方法、一般方法、代码块),每种方法下的锁对象
1.6 优化:锁粗化、锁消除、自适应自旋锁、偏向锁、轻量级锁
锁升级过程
图解
文字
无锁
偏向锁
轻量级锁
重量级锁
重量级锁的原理(monitor 对象,monitorenter、monitorexit)
ReentrantLock 和 Synchronized 的区别
Volatile
原理
有序性、可见性
对比 Synchronized
是否保证原子性
Atomic类
常用的几个类
原理
应用场景
LockSupport
LockSupport 是什么
3 种让线程等待和唤醒的方法
LockSupport 类中的等待和唤醒
等待 park()
唤醒 unpark()
LockSupport 原理
AQS
是什么
锁和同步器
原理
概述(图)
源码(以 ReentrantLock 为例)
核心方法
lock()
acquire()
tryAcquire(arg)
nonfairTryAcquire(acquires)
return false
继续推进条件,走下一步方法 addWaiter()
return true
结束,获取到锁
addWaiter(Node.EXCLUSIVE)
initializeSyncQueue()
acquireQueued(addWaiter(Node.EXCLUSIVE), arg)
shouldParkAfterFailedAcquire(p, node)
return true
parkAndCheckInterrupt()
return false
自旋
unlock()
release()
tryRelease()
unparkSuccessor()
步骤总结
三大组件(Semaphore、CountDownLatch、CyclicBarrier)
JVM
类加载机制(5 个过程)
对象的创建过程 (5 个过程)
双亲委派模型(加载过程、3 种类加载器)
运行时内存划分(线程私有、线程共享)
JMM(Java 内存模型)
判断对象是否死亡的两种方法(引用计数法、可达性分析法)
强、软、弱、虚引用
三种垃圾回收算法
GC 分代
新生代(三个区域、垃圾回收算法、晋升老年代)
老年代(什么情况下对象进入老年代、垃圾回收算法)
为什么要 GC 分代
垃圾回收器
Serial
ParNew
Parallel Scavenge
CMS
G1
内存溢出、内存泄漏排查
JVM 调优(常用指令)
周三
MySQL
存储引擎
MyISAM(5.5 之前使用)
InnoDB(现在使用)
存储引擎对比(4点)
索引
什么是索引
什么情况下创建索引
索引有哪些数据结构
什么是覆盖索引
B+ 树和红黑树的区别
B+ 树和 B 树的区别
分库分表
SQL
SQL 语句的执行顺序
一条 SQL 执行得很慢有哪些原因 ?
Redis
分布式缓存常见的技术选型方案
Redis 和 Memcached 的区别
缓存数据的处理流程
为什么用 Redis 做缓存
Redis 常见的数据结构
string
使用方法
底层数据结构
应用场景
list
使用方法
底层数据结构
应用场景
set
使用方法
底层数据结构
应用场景
zset
使用方法
底层数据结构
应用场景
hash
使用方法
底层数据结构
扩容机制
应用场景
Redis 多线程
Redis 为什么不使用多线程
Redis 为什么又引入了多线程
缓存过期
Redis 给缓存设置过期时间的用处
Redis 如何判断数据是否过期
Redis 的过期数据删除策略
Redis 的内存淘汰机制
Redis 的持久化机制
Redis 的事务
缓存穿透
什么是缓存穿透
如何解决缓存穿透
缓存雪崩
什么是缓存雪崩
如何解决缓存雪崩
Redis 实现分布式锁
什么是分布式锁
实现思想
setnx
expire
周四
Mybatis
什么是 Mybatis
Mybatis 有哪些优点
Mybatis 有哪些缺点
Mybatis 为什么叫做半自动 ORM 工具
#{} 和 ${} 的区别
Mybatis 的缓存机制
Spring
Spring IOC
什么是 IOC 和 DI
实现 DI 的 3 种方法
构造器注入
setter 方法注入
接口注入
Spring IOC 的原理
Spring IOC 初始化过程
Spring AOP
什么是 AOP
AOP 的实现原理
Spring AOP 和 AspectJ AOP 的区别(4点)
AOP 常用注解
@Before
@After
@AfterRunning
@AfterThrowing
@Around
Spring AOP 的执行顺序
Spring 4
Spring 5
Spring Bean
如何将一个类声明为 Bean
Bean 的作用域
singleton
prototype
request
session
global-session
Bean 的生命周期
单例 Bean 的线程安全问题
@Component 和 @Bean 的区别
Spring 事务
Spring 管理事务的方式
Spring 中事务的隔离级别
Spring 中事务的传播行为
Spring 中的设计模式
Spring 循环依赖
什么是循环依赖
两种注入方式对循环依赖有什么影响
构造方法注入
setter 注入
总结
Spring 容器
循环依赖场景
默认的单例(singleton)的场景是支持循环依赖的,不会报错
原型(prototype)的场景是不支持循环依赖的,会报错
三级缓存
Spring 内部通过三级缓存来解决循环依赖(DefaultSingletonBeanRegistry)
Spring 中 A/B 两对象在三级缓存中的迁移过程
源码角度分析
debug 断点
Spring 解决循环依赖源码流程图
Spring 解决循环依赖源码文字流程(配合流程图食用)
周五
Spring MVC
介绍一下 Spring MVC
Spring MVC 的处理流程(工作原理)
@Controller 和 @RestController 的区别
Spring Boot
介绍一下 Spring Boot
Spring Boot 的优点
什么是自动装配
自动装配原理
什么是 Spring Boot Starters
Spring Boot 支持哪些内嵌的容器
Tomcat
Jetty
Undertow
如何在 Spring Boot 中使用 Jetty 而不是 Tomcat
介绍一下 @SpringBootApplication 注解
Spring Boot 有哪些配置文件
YAML 配置文件的优势在哪里
Spring Boot 如何读取配置文件信息
Spring Boot 加载配置文件的优先级
Spring Boot 如何做请求参数的校验
Spring Boot 如何实现定时任务
消息队列
周六
计算机网络
五层的作用
网络层
传输层
应用层
操作系统
Linux 常用命令
0 条评论
下一页