集合相关
ArrayList
ArrayList 扩容机制 (JDK8)
无参初始化 初始是一个空数组
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
有参可以设置长度
有参可以设置集合 根据集合设置大小
add方法的扩容机制
addAll方法的扩容机制
小结
迭代器 Iterator_FailFast_FailSafe 遍历策略
两张遍历规则
ArrayList迭代器是FailFast
CopyOnWriteArrayList()迭代器是FailSafe
FailFast源码分析
FailSafe源码解析
Arraylist 和linkedList
HashMap
数据结构
hash表的应用场景
链表过长的解决——扩容
扩容之后 桶下标会重新计算,进而导致之前一样的桶下标变化,但如果原始hash值一样,扩容就会失效
**一开始满13个元素扩容 **
元素的个数到达hash表总长度的3/4就会扩容
链表过长的解决——树化
扩容为64还是有链表长度大于8,之后会树化
红黑树的意义,树化的阈值
红黑树退化为链表
索引如何计算
注意:按位与 与数-1之前要为2的n次幂
为何要二次哈希
为了使值更均匀
HashMap 容量为何是2的n次幂
HashMap 容量不为2的n次幂行不行
追求效率选2的n次幂,追求分布性选择质数 hashmap 最终选择了2的n次幂 hashtable 容量不是2的n次幂
hashMap put的流程
负载因子为啥是0.75
HashMap 并发丢数据
并发扩容死锁
hashMap_key的要求
String对象的hashcode的设计
单例模式
1 饿汉方式
反射破坏单例
反制
反序列化破坏单例
反制
unsafe破坏单例
枚举饿汉
并发篇
线程状态 java中的线程状态
5种状态 VS 6种状态
线程池核心参数
sleep与wait
打断
lock vs synchronized
lock 阻塞
公平锁非公平锁
条件变量演示
volatile是否可以保证线程安全
原子性
运行次序的不同导致错误
可见性
错误回答
正确答案
解决方法
volatile有序性
volatile保证有序性 使用内存屏障解决指令重排序,但效果也受到加入位置的影响
可以保证r1,r2不出现 1,0的情况
加载x上无法避免1,0
volatile位置不同影响原因分析
悲观锁和乐观锁
悲观锁
乐观锁
乐观锁 Unsafe
悲观锁和乐观锁的代码对比
悲观 不会发生指令交错
乐观 会指令交错
Hashtable vs ConcurrentHashMap (都是线程安全集合)
HashTable
整个hashTable一把锁
扩容大小是×2+1
不需要二次hash
ConcurrentHashMap java7版本
segment+数组+链表
ConcurrentHashMap java7版本 索引计算
segment的计算
segment中小数组的计算
ConcurrentHashMap java7版本 扩容机制
segment不能扩容
小数组扩容超过3/4 扩容一倍
concurrentHashMap segment[0]原型
ConcurrentHashMap java7版本 vs java8版本
8版本没有segment,懒汉式初始化,扩容方法到3/4就扩容(不用超过)
ConcurrentHashMap java8版本 构造参数含义
注意 数组长度是2的次方
并发put
ConcurrentHashMap java8版本 扩容
从后往前迁移节点
ConcurrentHashMap java8版本 扩容时的细节
扩容时发生get 可以并发执行, 已经F的就到扩容后的数组中找,没F的就到原数组中找。 扩容时发生put, 如果发生在迁移之前的节点,则放入,如果put正在迁移的节点就会阻塞,如果是已经迁移完成的节点,阻塞或帮忙迁移