PS:这章已经听不懂了QAQ
1 集合规约Collection 是总头领。Set, List, Queue 都继承自 Collection。
数据结构: 逻辑意义上的数据组织方式及其相应的处理方式。
数据组织方式: 线性结构;树结构;图结构;哈希结构;
数据处理方式: 增删改查
数据结构的优化与运算规模有关,也与调用频率有关。
2.1 HashMapHashMap 具有多个slot,每个 slot 保存一个链表。当链表中的数据个数超过某个阈值时【Size()>=64,同一bucket元素>=8】,链表变为红黑树。
初始化:
HashMapmap = new Hashmap<>(initialCapacity: 13);
什么时候分配空间?如何为13初始容量分配空间?
HashMap 分配空间的大小:比 Capacity 大的2的幂次方
比如初始13就分配2^4=16的空间
那么怎么拿到这个16呢?
然后下一步就是落槽
比如9,取模8相当于和0111与运算,得1就是在第2个槽
然后哈希值计算的时候用的hashcode再异或再无符号右移16位。(为了防止高16位或低16位统一出现某种特征的情况)
下面再放几张图,这部分太难懂了
扩容:
ArrayList 中的 subList 结果不可强转成 ArrayList。因为内部类 SubList 并不是 ArrayList 本身。而是 ArrayList的一个视图。
在subList 场景中:
- 高度注意对父集合元素的增加或者删除,均会导致子列表的遍历
- 增加删除产生ConcurrentModificationException异常
- 每次subList子列表的遍历,增加,删除都会调用checkForComodificaition()。
并发:交替处理多任务
并行:同时处理多任务
线程不安全指的是:线程在交替执行的时候,共享某个资源。但是在使用的时候没有加锁,数据发生了变化。
使用线程不安全的情况:
有时会选择线程不安全的情况,比如数据只在单线程内可见,或者对象是只读的。
保证高并发下的线程安全,可以从以下四个维度考量:
数据单线程可见
只读对象
线程安全类
同步与锁机制
AQS:解决多线程访问共享资源并发问题的同步管理框架。
AQS 抢的是 int state : 更新状态的控制权
队列:资源队列;等待队列
独占线程:在 AOS 中设置的
线程可以拥有自己的操作栈、程序计数器、局部变量表等资源。它与同一进程内的其它线程共享该进程的所有资源。
2.6.1 线程状态 2.6.2 线程池的状态


