-
初始化方式|长度是否固定|存储类型|存储空间 | 操作效率(详情见问题传送门)
-
List :ArrayList | linkedList , set : hashSet | TreeSet , Map:HashMap |TreeMap
-
一个是接口,一个是工具类
-
一个是迭代器 iterator , 一个是迭代接口,实现该接口需要实现迭代器
-
排序接口有int ComPare(B),和 Compare(A,B) ,但是如果返回
-
大于0,表示A|B的顺序需要调换
-
等于0可以不动可以换
-
小于0不动
-
Collection的方法需要传入删除值,然后是先去遍历找到对应的值删除,iterator是迭代的过程中进行remove,至于删除哪个值,remove不关注
-
list可重复,有顺序,有get方法 , set不可重复,无序,无get方法
-
list可重复,有顺序,可存储null,Map无序,key不能重复,key只能存一个null,val可以存多个null
-
内存空间上是连续,查询数组的快,可直接定位。增|删:链表方便,数组需要移动数据位置(除了头尾增删)
-
不安全| 例子??
-
CopyOnWriteArrayList是写队列,写时有锁,读时无锁使用的是读写锁
-
set不允许重复,用户集合搜集
-
hashset是根据hash计算值去重,treeset通过树形结构去重
-
size , interator, add | remove, stream
-
put | get ,keysets,values |foreach
-
key和val都能存null,但是key只能存一个null
-
16, 当存储值大于 16*0.75
-
put会先进行 hash值计算获取数组index位置,然后判断是否已经存在值了,如果不存在,直接初始化链表,插入val值|如果存在,从头到尾判断key是否重复:重复进行更新|匹配到最后如果不重复,就在尾部插入值(拉链法解决hash冲突)
-
get就是put的逆过程
-
size获取key的值
-
安全问题
-
CurrentHashMap是安全的,比hashTable高效
-
hashMap底层是数组加链表,1.8之后底层是数组+链表|红黑树
-
同1.7,hash的方式有变化,增加红黑树与链表的转换
-
同1.7,后续记录都以1.8为主
-
同1.7,后续记录都以1.8为主
-
拉链法
-
1.7不做记录,后续记录都以1.8为主
-
1.7不做记录,后续记录都以1.8为主
-
1.7不做记录,后续记录都以1.8为主
-
1.7不做记录,后续记录都以1.8为主
-
通过CAS + Volatile 和Synchronize , 目前JDK团队对Synchronize 的优化已经不输AQS
-
CAS + Volatile
-
Node节点数量 > 64 这个前提下,链表大于8开始转为红黑树,树小于6转为链表
-
1.8的并发度由数组长度决定,1.7固定大小16,有segment决定
-
put操作:
-
先计算hash值,确定操作 Node[]数组的位置 index
-
如果数组为空,先初始化数组 Node[]
-
设置初始head值在index位置 - CAS + Volatile
-
使用Synchronize :
-
设置链上数据,如果key相同,就是更新,如果没有重复key,就存放val到尾巴上。(拉链法,尾插)
-
插入的方式根据当前结构:链表结构插入|树形结构插入
-
进行链表和树的转化判断
-
判断是否需要扩容
-
get操作:计算hash,获取链|树的数据
-
size,先进行2次不加锁的查询,如果还没有成功,就进行lock获取
-
跳表结构是多层索引结构---跳表的复杂度是 O(LogN)
-
加快查询速度
-
空间还时间
-
先排序,二分查询
-
红黑树的5条规则------红黑树的查询复杂度是树的深度
-
节点非红即黑
-
根节点必黑
-
叶子节点必黑
-
兄弟节点的颜色相同,红色节点下是2个黑色节点
-
任何节点到左右叶子节点的黑点数量相同
-
通过左旋右旋,靠近平衡二叉树
-
XXX
-
增加CPU的利用率,提高程序性能
-
时间片轮转的一种古老的算法,表示将cpu的运行权分隔成一块块的时间,每个进程轮流分配
-
并行时线程同时处理的数量,并发时单位时间内有多少线程运行
-
协作式,系统来分配CPU时间片归属
-
XX
-
new Thread , runnable callable
-
有run方法和start方法,有sleep方法和interrupt方法,还有threadlocal
-
runnable
-
run只是普通方法,start表示启动新的线程
-
有无返回值
-
通过get方法获取
-
线程池提交线程任务后,可以通过Future获取
-
XXX
-
XXX
-
ready - running - block / Wait / WAIT TIMEOUT --- terminated
-
synchronized的Object对象锁,wait线程阻塞进入WAIT状态, notify唤醒任意阻塞的线程,notifyAll唤醒所有阻塞线程
-
sleep休眠会占用CPU资源,wait阻塞会释放CPU资源
-
一个是执行中断,一个是中断状态
-
interrupt,安全中断
-
临界资源互相占有,但是友互相等待对方释放
-
synchronized基本类型无法使用,引用类型数据可以使用
-
都可以
-
volatile修饰的属性可以保证数据可见性,synchrnized保证对象的可见性,数据一致性,操作原子性
-
线程局部变量
-
XXX
-
XXX
-
减少线程创建造成的资源消耗,复用线程
-
coreThread | maxThread|TimeOut | BlockQueue | ThreadFactory | RejectRefrence
-
IO密集型:Core线程数可以开高一些CPU数*N | CPU密集型:core线程数控制在CPU核 *1
-
看任务性质选择,有界 OR 无界
-
拒绝策略是为了防止任务堆积,出现服务停止。 拒绝策略按照任务性质选择,最好自定义实现,做好日志记录
-
先进先出,队列为空时,弹出动作会阻塞 | 队列满时,压入队列动作会阻塞
-
见上一条问题回答
-
延迟到期才会弹出
-
add | put | offer | remove | pull | take
-
XXX
-
XXX
-
cas | reentrantLock | readWriteLock |
-
cas 乐观锁 ,竞争少 , SYC悲观锁,竞争多
-
CAS 竞争多的时候,CPU消耗高,ABA修改,增加版本号控制
-
ReetrantLock
-
实现抽象类AQS,可行方法,tryAcquire ,tryRelease
-
try finally
-
在tryacquire动作中最新进入的任务是否直接取竞争锁,区分公平与非公平
-
是否可重入通过state 是否可以大于1来区分,重入几次,state就等于几
-
读写锁,读写隔离,读锁可重入,写锁与写锁不可重入,写锁与读锁不可重入
-
AQSXXX
-
XX
-
XX
-
XX
-
XX
-
XX