面试复习
Java基础
容器
Map
- HashMap
- 默认大小, 扩容
- hash冲突
- 链表/红黑树
- 多线程操作, 1.7死循环
- ConcurrentHashMap
- 并发原理
- 1.7和1.8对比
- HashTable
- 并发原理
- TreeMap
- 底层结构
- 红黑树
- 基本定义
- 插入思想
- https://www.jianshu.com/p/e136ec79235c
- 对比AVL
Collection
- ArrayList
- 默认大小, 扩容(10, 1.5)
- 对比LinkedList, Vector
- 获取数据O(1), 扩容O(1)
- LinkedList
- 基本结构
- Vector
- 并发原理
- CopyOnWriteList
- 基本结构
- 并发原理
- HashSet
- 基本结构
- ConcurrentHashSet
- Queue/Deque
- api
- PriorityQueue
- 堆
并发
线程
- http://ifeve.com/java-concurrency-thread-directory/
- https://www.cnblogs.com/java1024/archive/2019/11/28/11950129.html
- https://www.cnblogs.com/zhanht/p/5450325.html
- java中线程的状态
- 线程池
- http://ifeve.com/java-threadpool/
- https://yq.aliyun.com/articles/687794
- https://blog.51cto.com/14230003/2418026?source=dra
- https://blog.csdn.net/weixin_28760063/article/details/81266152
- https://www.cnblogs.com/a8457013/p/7819044.html
- https://www.cnblogs.com/x-bing/p/5680611.html
- https://www.jianshu.com/p/174958a72ce9
- 创建, 参数
- 基本原理
- 执行流程
- 带看源码
- 判断过程: corePoolSize(核心线程) -> workQueue(任务队列) -> maxPoolSize(最大线程) -> RejectedExecutionHandler(拒绝策略)
- 如果此时线程池中的数量小于corePoolSize,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务。
- 如果此时线程池中的数量等于corePoolSize,但是缓冲队列workQueue未满,那么任务被放入缓冲队列。
- 如果此时线程池中的数量大于等于corePoolSize,缓冲队列workQueue满,并且线程池中的数量小于maximumPoolSize,建新的线程来处理被添加的任务。
- 如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量等于maximumPoolSize,那么通过 handler所指定的策略来处理此任务。
- 当线程池中的线程数量大于 corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止。这样,线程池可以动态的调整池中的线程数。
- Worker的创建和释放
- 带看源码
- 执行流程
- Runnable, Callable
- submit, execute
- submit() 该方法返回一个Future对象,可执行带返回值的线程;或者执行想随时可以取消的线程。Future对象的get()方法获取返回值。Future对象的cancel(true/false)取消任务,未开始或已完成返回false,参数表示是否中断执行中的线程
- execute() 没有返回值。
- Executors提供的几种线程池和队列
- https://blog.csdn.net/weixin_40304387/article/details/80508236
- newCachedThreadPool
- 定时任务, ScheduledThreadPoolExecutor
- DelayedWorkQueue
- 最小堆
- 看源码
- DelayedWorkQueue
- 协程
锁, JUC
- CAS, ABA
- synchronized
- ReentrantLock
- https://cloud.tencent.com/developer/article/1414968
- https://baijiahao.baidu.com/s?id=1638104862611986445&wfr=spider&for=pc
- 公平/非公平
- 区别: 有没有排队
- ReentrantReadWriteLock
- 带看源码
- AQS
- 带看源码
- CLH
- 看到2.3即可
- 独占, 共享: ReentrantReadWriteLock
- Latch, Barrier, Semaphore
- volatile
- 两个功能
- 线程可见性
- 禁止重排序
- https://www.jianshu.com/p/ef8de88b1343
- https://www.cnblogs.com/yaowen/p/11240540.html
- happen-before, 简读: http://www.voidcn.com/article/p-qzqvusbt-ke.html
- 两个功能
JVM
对象, 引用和值传递
- https://www.cnblogs.com/dolphin0520/p/3592498.html
- https://blog.csdn.net/weixin_38719347/article/details/80961874
- https://segmentfault.com/a/1190000018221603
内存模型
- https://juejin.cn/post/6844903782795444238
- https://www.jianshu.com/p/c1ac5e7a5f87
- https://zhuanlan.zhihu.com/p/38348646
类加载
GC
- 搜索算法
- 回收算法
- 分代思想
- CMS, G1
- ZGC
- 内存泄漏
New对象
反射 *
Redis
- 数据类型, 底层结构
- 持久化
- 分布式锁
- redis
- setnx
- redisson *
- zookeeper
- 怎么避免主从不一致, RedLock
- redis
- 布隆过滤器
- 缓存击穿, 穿透, 雪崩
- 主从同步
- 哨兵
MySQL
binlog, undo log, redo log (二进制日志)
- https://blog.csdn.net/u010002184/article/details/88526708
- binlog
- 记录数据库表结构变更(例如CREATE、ALTER TABLE…)
- 表数据修改(INSERT、UPDATE、DELETE…)
- 不会记录SELECT和SHOW这类操作,因为这类操作对数据本身并没有修改,可以通过查询通用日志来查看MySQL执行过的所有语句。
- undo log, redo log
行记录格式
Compact 行格式 变长字段长度列表 null值列表 记录头部信息 隐藏列 * 数据列 RowID(6字节)如果没有定义主键会添加 TransactionID(6字节)事务列 Roll Point(7字节)回滚指针列 列1 列2 ... 主键id *
- 不设置的处理方式
- Innodb表中在没有默认主键的情况下会生成一个6byte空间的自动增长主键
- 为什么一般都用自增 *
- 不设置的处理方式
InnoDB, MyIsam
索引
ACID的实现原理 *
- https://blog.csdn.net/qq_39521554/article/details/80240841
- 原子性, undo log
- 一致性
- 隔离性, 隔离级别, MVCC
- 持久性, redo log
隔离级别, MVCC, ReadView **
- https://www.cnblogs.com/wwcom123/p/10727194.html
- 简述
- 重点
- https://www.codercto.com/a/88775.html
- https://blog.51cto.com/12182612/2486731
- https://zhuanlan.zhihu.com/p/75737955
- https://zhuanlan.zhihu.com/p/117476959
- RC, RR的区别
- Read View生成时机的不同,从而造成RC,RR级别下快照读的结果的不同
锁类型
- https://zhuanlan.zhihu.com/p/75737955
- 简读即可 *
- 意向锁
- 间隙锁 *
主从复制
转账 *
- 单向, A -> B
- 双向, A -> B & B -> A, 怎么避免死锁(不考虑锁机制)
- 设计转账系统
- 同步转账
- 异步转账
网络
- https://www.jianshu.com/p/27862635c077
- https
- tcp网络协议, 拥塞控制
- NIO
- 原理
- select/poll
- epoll
- epoll, select/poll对比
- 零拷贝
- https://mp.weixin.qq.com/s/oPv1-wrhYjiOC1o0M0tjMA
- https://my.oschina.net/u/3990817/blog/3045359
- https://zhuanlan.zhihu.com/p/88789697
- 文件传输
- 传输大文件的时候, 使用「异步 I/O + 直接 I/O」
- 传输小文件的时候, 则使用「零拷贝技术」
- session, cookie区别
- 进程通信方法
- 输入网址到返回结果的全部过程, 数据流转, 缓存, DNS, 后端处理, 转发
设计模式
Spring
- IOC
- BeanFactory
- ApplicationContext
- Bean的创建, 生命周期
- 声明Bean的方式
- 注解, @Component, @Bean
- XML
- AOP
- 动态代理
- JDK
- CGLIB
- SpringBoot
- 基本思想
- starter原理, EnableAutoConfiguration
- 设计模式
- 单例
- 工厂
- 代理
- 责任链, Filter
- 模板, RedisTemplate
- 策略, Interceptor
- BeanFactory, FactoryBean
- 事务
- 管理方式
- 编程式, 使用TransactionTemplate开启关闭和提交事务
- 声明式, @Transactional, XML
- 传播行为
- 管理方式
- 循环依赖
- MyBatis
中间件
Kafka
- 数据存储, 流程
- 高可用
- 持久化
- 消息队列, 重复消费, 事务消息
- 顺序消费
- 借助数据库
- 监听器关闭消费者
- 不同队列的对比
Thrift
分布式
- 缓存类型, 从客户端到服务端
- 一致性Hash
- 熔断, 限流, 降级
- 微服务
- 分布式调度
- CAP
- 分布式事务
系统设计
- 秒杀系统
- 缓存
- 页面
- 数据
- 预热
- MQ
- 异步
- 削峰
- 解耦
- 数据库
- 主从
- 读写分离
- 分库分表
- 读弱一致, 写强一致
- 隔离
- 数据
- 系统
- 业务
- 缓存
- 短链接生成
- 过期时间
- 分布式id生成
- 高并发的红包系统
- 根据红包id进行机器hash, 固定机器处理
- 串行请求队列
- 分库分表, 时间维度
- 分布式ID生成
- 机器分片
- 时间戳+机器id+递增id
- 分布式限流
- 固定窗口
- 滑动窗口
- 漏桶, 不能处理突发请求
- 令牌桶
- 分布式定时任务
- 新浪微博怎么推送微博
- 推, 只推送在线
- 拉, 手动刷新列表
- 缓存用户关系
- 大文件有限内存排序
问题
- 通过MQ同步处理数据, 信号量/锁
- 文件系统, 文件夹/文件, 公共属性
- 多数据源一致性
- 接口耗时高, 数据库/缓存
- 数据库缓存一致性
- 分布式限流
- 字典搜索
- 离线数据同步
缓存一致性
删缓存
- 先删后更新数据库
- 删-更-删
- 先更新数据库再删
- 异步, 监听binlog
- 先删后更新数据库
更新缓存
- 先更新缓存, 在更新数据库
- 先更新数据库后更新缓存
- 更新缓存失败的时候, 记录进行异步处理
本地缓存, 事件总线监听刷新
项目
- 如何找项目性能瓶颈
- 项目亮点, 难题, 处理