1、hashmap
1.1 iterator遍历效率高,Map.Entry entry = (Map.Entry) iter.next();
1.2 hashMap 数据结构 hash算和寻址算
a jdk 1.7及之前 是数组+链表 存储地址是hash值对数组取模,然后定位到数组中去
b jdk 1.8及之后 是数组+链表(o(n))+红黑树(o(logn)) 存储地址是经过优化的hash值(高16位异或运算)与运算 ,然后定位到数组中去,
定位相同数组变量超过8的时候会把链表换成红黑树
c hash优化,高16位进行了异或,让低16位同时拥有高16位和低16位的特征,尽量避免hash值冲突
1.4 hashMap扩容
初始加载因子是16,超过空间的0.75就会扩容,扩容到32位,扩容之后也许以前在同一个位置的,扩容后在不同位置
2、synchronized 传递类就是对类加锁,传递对象就对对象进行加锁
对象的monitor的值用来记录是否有线程对它进行加锁 ,monitorenter monitorexit,只有一个线程能对它进行加锁成功,每个对象关联一个monitor,monitor里面有一个计数器
3、CAS compare and set先比较在设置,从硬件级别保证一定的原子的,同一时间只有一个线程可以执行CAS,先比较再设置,autointeger和conhash赋值的时候采用这种策略
4、ConCurrentHashMap 1.7及之前用的是分段锁 segment 1.8及之后锁力度的细化,每个元素都有自己的锁
5、JDK中AQS(Abstract Queue Synchronizer) ReentrantLock的底层是基于AQS实现的,CAS+一个等待队列,默认策略非公平锁
6、JDK 线程池 线程执行完任务后会卡到阻塞队列里,期间来新任务如果不到核心线程数会new线程,
5个参数 核心线程数、最大线程数、队列、keepalive(超过核心线程创建的线程空闲最大时长)、丢弃策略,防止线程池数据丢失可以插入数据库落地
自己可以new 线程池,ThreadPoolExecutor
corePoolSize 核心线程数量
maximumPoolSize 最大线程数量
keepAliveTime 线程保持时间,N个时间单位
unit 时间单位(比如秒,分)
workQueue 阻塞队列
threadFactory 线程工厂
handler 线程池拒绝策略;
shutdown只是将线程池的状态设置为SHUTWDOWN状态,正在执行的任务会继续执行
下去,没有被执行的则中断。而shutdownNow则是将线程池的状态设置为STOP,正在
执行的任务则被停止,没被执行任务的则返回
7、红黑树,根节点是黑色的,每个叶子节点是黑色,如果一个节点是红色它的两个子节点是黑色的,树中的每个节点上包含五个域:color、key、left、right、p
8、平衡二叉树 非叶子节点只能允许最多两个子节点存在,非叶子节值大于左边子节点、小于右边子节点,树的左右两边的层级数相差不会大于1,没有值相等重复的节点
9、B树 递增次序排列,左小右大;非叶节点的子节点数>1,且<=M ,且M>=2;枝节点的关键字数量大于等于ceil(m/2)-1个且小于等于M-1个(注:ceil()是个朝正无穷方向取整的函数 如ceil(1.1)结果为2);所有叶子节点均在同一层、叶子节点除了包含了关键字和关键字记录的指针外也有指向其子节点的指针只不过其指针地址都为null对应下图最后一层节点的空格子;B树相对于平衡二叉树的不同是,每个节点包含的关键字增多了,特别是在B树应用到数据库中的时候,数据库充分利用了磁盘块的原理(磁盘数据存储是采用块的形式存储的,每个块的大小为4K,每次IO进行数据读取时,同一个磁盘块的数据可以一次性读取出来)把节点大小限制和充分使用在磁盘快大小范围;把树的节点关键字增多后树的层级比原来的二叉树少了,减少数据查找的次数和复杂度;
10、B+树 B+跟B树不同B+树的非叶子节点不保存关键字记录的指针,只进行数据索引,这样使得B+树每个非叶子节点所能保存的关键字大大增加;B+树叶子节点保存了父节点的所有关键字记录的指针,所有数据地址必须要到叶子节点才能获取到。所以每次数据查询的次数都一样;B+树叶子节点的关键字从小到大有序排列,左边结尾数据都会保存右边节点开始数据的指针;B+树的层级更少:相较于B树B+每个非叶子节点存储的关键字数更多,树的层级更少所以查询数据更快;B+树查询速度更稳定:B+所有关键字数据地址都存在叶子节点上,所以每次查找的次数都相同所以查询速度要比B树更稳定;B+树天然具备排序功能:B+树所有的叶子节点数据构成了一个有序链表,在查询大小区间的数据时候更方便,数据紧密性很高,缓存的命中率也会比B树高。B+树全节点遍历更快:B+树遍历整棵树只需要遍历所有的叶子节点即可,,而不需要像B树一样需要对每一层进行遍历,这有利于数据库做全表扫描。