1. 集合规约
1.1 集合框架图
1.2 数据结构与时间复杂度
1.2.1 数据结构
指的是逻辑意义上的数据组织方式,及其相应的处理方式
1.2.2 数据组织方式
| 线性结构 | 树结构 | 图结构 | 哈希结构 |
|---|---|---|---|
1.2.3 数据处理方式
增、删、改、查 以某种特定的算法实现数据的增加、删除、修改、查找和遍历
1.3 HashMap的基本概念
1.3.1 HashMap的初始化
HashMap<Integer, String> map = new HashMap<> (13);
什么时候分配空间? 如何为13初始容量分配存储空间?
1.3.2 计算落槽位置
1.3.3 Collectirs.toMap()方法的内部构造
在使用java.util.stream.Collectors类的toMap方法转为Map集合时,一定要使用含有参数类型BinaryOperator,参数名为mergeFunction的方法,否则当出现相同key值会抛出IllegalStateException异常
value为null时,会发生NPE
1.4 ArrayList的subList结果,不可强转为ArrayList
2. 并发处理
2.1 什么是并行与并发
- 并行 指同时处理多任务的能力
- 并发 指某个时间段内,多任务交替处理的能力
同一CPU不同时刻,交替执行不同的方法,就是并发 不同CPU同一时刻执行不同的方法,就是并行
2.2 线程安全
- 线程安全问题只在多线程环境下才出现,单线程串行执行不存在此问题
- 保证高并发场景下的线程安全,可以从以下四个维度考量
| 数据单线程内可见 | 只读对象 | 线程安全类 | 同步与锁机制 |
|---|
2.3 什么是锁
- 起初锁的概念 在计算机的信息世界里,单机单线程时代没有锁的概念
- 资源竞争的出现 自从出现了资源竞争,人们才意识到需要对部分场景的执行现场加锁,昭告天下,表明自己的“短暂”拥有
- Java中常用锁实现的方式
1. 用并发包中的锁类2. 利用同步代码块
2.4 AQS透过现象看本质
2.5 线程与线程池的奥秘
2.5.1 线程池的作用
- 利用线程池管理并复用线程、控制最大并发数等
- 增加对线程的管理、快速排查问题
- 实现任务线程队列缓存策略和拒绝机制
- 实现某些与时间相关的功能,如定时执行、周期执行等
- 隔离线程环境 比如交易服务和搜索服务在同一台服务器上,分别开启两个线程池,交易线程的资源消耗明细要大,因此,通过独立配置的线程池,将较慢的交易服务与搜索服务隔开,避免各服务线程相互影响