list 下 arraylist ,linkedlist实现和区别
1.arraylist 使用的Object数组 ,linkedlist是双向链表
arraylist 增删慢 , 查询快,
linkedlist 增删快 , 查询慢 ,
线程都不安全。
2.arraylist 扩容
初始化是一个空数组,
第一次扩容为10.
每次扩容之后都会变味原来的1.5倍左右
hashmap 实现 ,扩容
1.7之前是数组和链表 ,采用头插法
1.8之后链表长度大于8时,将链表转为红黑树 ,如果数组长度小于64 , 选择数组扩容,使用尾插法。
初始大小为16,HashMap中的元素个数之和大于负载因子*当前容量的时候就要进行扩充,容量变为原来的 2 倍
设置初始容量(初始容量 = 预知数据量 / 加载因子)
线程不安全
HashMap扩容的时候为什么是2的n次幂
(n-1)&hash
因为%操作除数是2的幂次等价于与除数减一的操作
hashmap put方法
key hash算法与与运算得出
数组下标为空时 , node放入
数组下标不为空时,jdk1.7 jdk1.8
HashMap源码中在计算hash值的时候为什么要右移16位
让元素在HashMap中更加均匀的分布
线程安全的集合
Vector ,hashtable ,concurrenthashmap,
Stack
concurrenthashmap
1.7时使用分段锁segment,每把锁只锁容器里部分数据
1.8 node数组 + 链表 + 红黑树 并发用synchronized 和cas , synchronized 只锁当前链表或红黑二叉树的首结点。
hashmap 和 hashtable区别
1.线程
2.空值
hashtable 不允许 null key null value
3.初始大小 hashtable 11 每次扩容变为 2n+1
hashmap 16 变为两倍
4.底层数据结构
5.效率
hashmap 和 Treemap的区别
1.hash 无序 ,tree 有序
2.hash 继承 abstractmap tree 继承 sortedmap
网友评论