一、Java基础
1. == 和 equals 的区别
==
比较的是地址(引用是否指向同一个对象)
equals
默认也是比较地址,但很多类(如String)重写后用于比较内容
2. String 为什么不可变
1)底层是 final 修饰的字符数组
2)保证线程安全
3)支持字符串常量池复用
4)提高性能(避免频繁创建对象)
3. final、finally、finalize 区别
final
修饰类、方法、变量,表示不可变
finally
异常处理中一定会执行的代码块
finalize
Object类方法,GC回收前调用(已不推荐使用)
4. 深拷贝与浅拷贝
浅拷贝
复制引用,多个对象指向同一块内存
深拷贝
复制对象本身,完全独立
二、集合框架
5. HashMap底层原理
JDK1.8结构:数组 + 链表 + 红黑树
流程:
1)计算hash
2)定位数组位置
3)冲突形成链表
4)链表长度 ≥ 8 转红黑树
6. HashMap为什么线程不安全
1)多线程put会数据覆盖
2)JDK1.7可能形成死循环
解决:使用ConcurrentHashMap
7. ConcurrentHashMap原理
JDK1.8:
1)数组 + 链表 + 红黑树
2)使用CAS + synchronized
3)锁粒度更小,提高并发性能
8. ArrayList扩容机制
1)默认容量为0(JDK8)
2)第一次扩容为10
3)之后按1.5倍扩容
9. List、Set、Map区别
List:有序,可重复
Set:无序,不可重复
Map:键值对结构,key唯一
三、并发编程
10. 线程创建方式
1)继承Thread
2)实现Runnable(推荐)
3)Callable + Future(有返回值)
11. Runnable和Callable区别
Runnable
无返回值,不抛异常
Callable
有返回值,可以抛异常
12. synchronized 和 Lock 区别
synchronized
自动加锁释放锁,简单
Lock
手动加锁释放,功能更强(可中断、公平锁)
13. 线程池核心参数
corePoolSize:核心线程数
maximumPoolSize:最大线程数
workQueue:任务队列
keepAliveTime:空闲时间
handler:拒绝策略
14. 线程池执行流程
1)核心线程执行
2)进入队列
3)创建最大线程
4)执行拒绝策略
15. volatile 作用
1)保证可见性
2)禁止指令重排序
3)不保证原子性
16. CAS是什么
Compare And Swap(比较并交换)
特点:
无锁机制,提高性能
缺点:ABA问题、自旋开销大
四、JVM
17. JVM内存结构
1)程序计数器
2)虚拟机栈
3)本地方法栈
4)堆
5)方法区
18. 堆和栈区别
栈:线程私有,存局部变量
堆:线程共享,存对象
19. 垃圾回收算法
1)标记清除
2)复制算法
3)标记整理
20. GC Roots有哪些
1)栈中的引用
2)静态变量
3)常量
4)本地方法引用
五、Spring
21. 什么是IOC
控制反转,对象由容器管理,而不是自己创建
22. 什么是AOP
面向切面编程,在不修改源码的情况下增强功能(如日志、事务)
23. Spring Bean生命周期
1)实例化
2)属性注入
3)初始化
4)使用
5)销毁
24. Spring事务失效场景
1)方法不是public
2)自调用(同类内部调用)
3)异常被捕获
4)数据库不支持事务
六、MyBatis
25. #{} 和 ${} 区别
#{}
预编译,防止SQL注入
${}
字符串拼接,存在注入风险
26. MyBatis缓存
一级缓存
SqlSession级别,默认开启
二级缓存
Mapper级别,需要手动开启
七、计算机网络
27. HTTP和HTTPS区别
HTTP
明文传输,不安全
HTTPS
加密传输,更安全
28. TCP三次握手
1)客户端发送SYN
2)服务端返回SYN+ACK
3)客户端发送ACK
29. TCP四次挥手
1)客户端发送FIN
2)服务端ACK
3)服务端发送FIN
4)客户端ACK
八、数据库(MySQL)
30. 索引的作用
1)提高查询效率
2)减少IO
31. B+树为什么适合做索引
1)多路平衡树,层级低
2)磁盘IO少
3)范围查询效率高
32. 事务四大特性(ACID)
原子性、一致性、隔离性、持久性
33. 常见隔离级别
读未提交
读已提交
可重复读(默认)
串行化
九、面试总结(背诵版)
面试核心必考:
1)HashMap底层原理
2)线程池执行流程
3)volatile和CAS
4)JVM内存结构 + GC
5)Spring IOC/AOP
6)MyBatis执行流程
7)TCP三次握手