You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
142 lines
8.7 KiB
142 lines
8.7 KiB
Java 核心知识点详细总结
|
|
一、Java 基础
|
|
1. 核心特性
|
|
跨平台原理:JVM屏蔽不同操作系统指令集差异,对外提供统一 Java API,实现跨平台运行。
|
|
数据类型:8 种基本数据类型,int 固定4 字节,long 需加L;包装类(Integer/Byte 等)支持 **-128~127 缓存机制 **。
|
|
字符串核心:
|
|
String:final 修饰不可变,底层private final char[],无修改方法;
|
|
StringBuilder:线程不安全、效率最高,适合频繁拼接;
|
|
StringBuffer:线程安全(synchronized)、效率低。
|
|
面向对象:四大特征封装、抽象、继承、多态;重载(同一类、方法名同参数不同)、重写(子类遵循两同两小一大规则)。
|
|
2. 核心机制
|
|
传递方式:Java 仅值传递,基本类型传数值,引用类型传内存地址。
|
|
反射:运行时获取类信息 / 调用方法,获取 Class 对象 3 种方式:getClass()、类.class、Class.forName()。
|
|
序列化:transient关键字修饰字段不参与序列化。
|
|
二、集合框架
|
|
1. 核心接口与工具
|
|
Collection:单值集合父接口;Collections:集合工具类,提供排序、查找等静态方法。
|
|
2. 常用集合对比
|
|
表格
|
|
集合类型 底层结构 线程安全 核心特性
|
|
ArrayList 数组 否 查询快、增删慢,默认容量10,扩容1.5 倍
|
|
LinkedList 双向链表 否 增删快、查询慢
|
|
Vector 数组 是 效率低,扩容2 倍
|
|
HashMap 数组 + 链表 + 红黑树 否 默认容量16,加载因子0.75
|
|
ConcurrentHashMap 1.8:Node+CAS+synchronized 是 高并发,桶级锁替代分段锁
|
|
3. 核心规则
|
|
HashSet 判重:hashCode()+equals() 双重判断;
|
|
HashMap 树化:链表长度 **>8且数组容量≥64**;退化:树节点≤6。
|
|
三、JUC 并发编程
|
|
1. 线程基础
|
|
创建方式:继承 Thread、实现 Runnable/Callable、线程池;Callable支持返回值、抛出异常。
|
|
线程状态:新建→可运行→运行→阻塞→死亡。
|
|
2. 同步机制
|
|
synchronized:JVM 层面锁,自动释放,可重入非公平;
|
|
ReentrantLock:API 层面锁,手动释放,可判断锁状态;
|
|
volatile:保证可见性、禁止指令重排,不保证原子性;
|
|
CAS:比较并交换,硬件级原子操作,存在ABA 问题(用AtomicStampedReference解决)。
|
|
3. 线程池
|
|
核心参数:corePoolSize(核心线程)、maximumPoolSize(最大线程)、keepAliveTime(空闲超时)、workQueue(任务队列)、threadFactory(线程工厂)、handler(拒绝策略);
|
|
执行流程:核心线程→队列→非核心线程→拒绝策略;
|
|
规范:手动创建ThreadPoolExecutor,避免Executors导致 OOM。
|
|
4. 其他核心
|
|
ThreadLocal:线程隔离,底层ThreadLocalMap,key 为弱引用;
|
|
死锁:四大条件(互斥、请求保持、不剥夺、环路等待),打破任一条件即可预防。
|
|
四、Java Web
|
|
1. HTTP 请求
|
|
GET/POST:GET 传参在 URL、长度受限、不安全;POST 传参在请求体、无长度限制、安全。
|
|
2. Servlet
|
|
生命周期:加载→实例化→init()→service()→destroy();
|
|
转发 / 重定向:转发(服务器端、一次请求、地址不变);重定向(客户端、两次请求、地址变更)。
|
|
3. 会话机制
|
|
Cookie:客户端存储,不安全,单条≤4K;
|
|
Session:服务器存储,安全,依赖 Cookie 传递 sessionId;
|
|
JWT:无状态 Token,适合分布式、移动端。
|
|
五、数据库
|
|
1. 基础知识点
|
|
存储引擎:InnoDB(支持事务、行锁)、MyISAM(无事务、表锁);
|
|
三范式:1NF(原子性)、2NF(唯一性)、3NF(消除传递依赖);
|
|
聚合函数:sum()、avg()、max()、min()、count()。
|
|
2. SQL 核心
|
|
PreparedStatement:预编译,有效防止 SQL 注入;
|
|
执行顺序:from→where→group by→having→select→order by。
|
|
六、索引与事务
|
|
1. 索引
|
|
数据结构:B + 树(MySQL 默认),非叶子节点存 key,叶子节点存数据 + 双向链表;
|
|
分类:聚簇索引(主键,存完整数据)、非聚簇索引(二级索引,存主键)、覆盖索引(无需回表);
|
|
失效场景:索引列运算、%开头 like、or、!=、is null。
|
|
2. 事务
|
|
ACID:原子性、一致性、隔离性、持久性;
|
|
隔离级别:读未提交→读已提交(Oracle 默认)→可重复读(MySQL 默认)→串行化;
|
|
并发问题:脏读、不可重复读、幻读。
|
|
七、主流框架
|
|
1. Spring
|
|
IOC:控制反转,对象创建交给容器;DI:依赖注入,自动装配依赖;
|
|
AOP:动态代理(JDK 代理 / CGLIB),通知类型:前置、后置、环绕、异常、最终;
|
|
事务失效
|
|
事务失效:异常捕获、抛出检查异常、非 public 方法、内部调用。
|
|
2. SpringBoot
|
|
自动配置:@SpringBootApplication整合配置、扫描、自动装配三大能力。
|
|
3. MyBatis
|
|
#{} / ${}:#{} 预编译防注入,${}字符串拼接不防注入;
|
|
缓存:一级缓存(SqlSession 级,默认开启)、二级缓存(Mapper 级,手动开启)。
|
|
八、设计模式
|
|
1. 六大原则
|
|
开闭原则、里氏代换、依赖倒转、单一职责、接口隔离、迪米特法则。
|
|
2. 常用模式
|
|
单例模式:饿汉式(线程安全)、懒汉式(双重检查 + volatile)、枚举式(防反射 / 反序列化);
|
|
代理模式:静态代理、JDK 动态代理(基于接口)、CGLIB 代理(基于子类)。
|
|
九、JVM
|
|
1. 类加载
|
|
过程:加载→验证→准备→解析→初始化;
|
|
双亲委派:自定义→应用→扩展→启动类加载器,避免类重复加载。
|
|
2. 运行时数据区
|
|
线程私有:程序计数器、虚拟机栈、本地方法栈;
|
|
线程共享:堆、方法区(JDK8 后为元空间)。
|
|
3. 垃圾回收
|
|
GC 算法:标记 - 清除、复制(新生代)、标记 - 整理(老年代)、分代收集;
|
|
垃圾收集器:G1(JDK9 默认,区域分代,低延迟);
|
|
内存溢出:堆内存不足,内存泄漏(单例、资源未关闭)。
|
|
十、Redis
|
|
1. 核心特性
|
|
数据类型:String、Hash、List、Set、ZSet;
|
|
持久化:RDB(快照,恢复快)、AOF(日志,数据安全);
|
|
淘汰策略:推荐allkeys-lru(淘汰最近最少使用数据)。
|
|
2. 缓存问题 & 解决方案
|
|
表格
|
|
缓存问题 核心原因 解决方案
|
|
缓存穿透 查询不存在的数据 缓存空值、布隆过滤器
|
|
缓存击穿 单个热点 key 过期 互斥锁、逻辑过期
|
|
缓存雪崩 大量 key 同时过期 / Redis 宕机 随机过期、集群、多级缓存
|
|
3. 分布式锁
|
|
核心命令:SET lock value NX EX 超时时间,Redisson 解决锁续期 + 重试。
|
|
十一、消息中间件
|
|
核心作用:解耦、异步、削峰填谷;
|
|
RabbitMQ:confirm 机制(生产者)、持久化(服务端)、手动 ACK(消费者)保证消息不丢失;幂等性解决重复消费。
|
|
十二、微服务
|
|
SpringCloud:提供服务注册发现、配置中心、网关、负载均衡、熔断降级;
|
|
Dubbo:阿里高性能 RPC 微服务框架。
|
|
十三、计算机网络
|
|
TCP:三次握手(建立连接)、四次挥手(关闭连接),可靠传输基于校验、重传、流量 / 拥塞控制;
|
|
跨域:违反同源策略,解决方案:CORS、Nginx 代理、JSONP。
|
|
十四、数据结构
|
|
递归:爬楼梯问题遵循斐波那契规律,f(n)=f(n-1)+f(n-2)。
|
|
4. 关键问题
|
|
问题 1:JDK1.8 中 HashMap 的底层原理、树化条件及线程安全方案?
|
|
答案:
|
|
底层原理:采用数组 + 链表 + 红黑树结构,通过 hash (key) 计算数组下标,哈希冲突用链表存储;默认容量16,加载因子0.75,扩容为原容量 2 倍。
|
|
树化条件:链表长度超过 8,且数组容量 **≥64** 时转为红黑树;树节点数≤6 时退化为链表。
|
|
线程安全方案:使用ConcurrentHashMap,JDK1.8 通过CAS+synchronized实现桶级锁,替代分段锁,并发性能大幅提升。
|
|
问题 2:Redis 缓存穿透、击穿、雪崩的核心区别与解决方案?
|
|
答案:
|
|
核心区别:缓存穿透是查询不存在的数据,缓存击穿是单个热点 key 过期,缓存雪崩是大量 key 同时过期 / Redis 宕机。
|
|
解决方案:
|
|
穿透:缓存空对象、布隆过滤器、参数合法性校验;
|
|
击穿:互斥锁重建缓存、热点 key 设置逻辑过期;
|
|
雪崩:key 过期时间加随机值、Redis 集群部署、多级缓存、限流降级。
|
|
问题 3:Spring 事务失效的常见场景及解决方法?
|
|
答案:
|
|
异常捕获未抛出:try-catch 捕获异常后未抛出,事务不回滚;解决:catch 块抛出RuntimeException。
|
|
抛出检查异常:Spring 默认仅回滚非检查异常;解决:@Transactional(rollbackFor = Exception.class)。
|
|
非 public 方法:AOP 仅代理 public 方法;解决:将方法改为 public。
|
|
同类内部调用:未经过代理对象,事务失效;解决:引入自身代理对象调用方法。
|