5. HashMap如何降低Hash冲突概率( 四 )


()方法是有返回值的,它表示用来尝试获取锁,如果获取成功,则返回true,如果获取失败(即锁已被其他线程获取),则返回false,这个方法无论如何都会立即返回 。在拿不到锁时不会一直在那等待 。
7.2 JDK1.源码解读
.8的取出取消分段设计,采用对CAS + 保证并发线程安全问题,将锁的粒度拆分到每个index
下标位置,实现的效率与.7相同 。
7.2.1 源码解读
:默认为0,用来控制table的初始化和扩容操作,具体应用在后续会体现出来 。
-1 代表table正在初始化
N 表示有N-1个线程正在进行扩容操作
其余情况:
1、如果table未初始化,表示table需要初始化的大小 。0
2、如果table初始化完成,表示table的容量,默认是table大小的0.75倍,居然用这个公式算0.75(n - (n >>> 2)) 。
记录每个线程size++的次数
8. 集合源码解读
底层是基于数组实现
System.arraycopy(elementData, index+1, elementData, index, numMoved);
src : 原数组
int: 从元数据的起始位置开始
dest : 目标数组
int: 目标数组的开始起始位置
int: 要copy的数组的长度
public class DemoArraylist {/*** 存放数据元素*/private Object[] elementData;/*** 记录存放的个数*/private int size = 0;/*** 默认容量为10*/private static final int DEFAULT_CAPACITY = 10;public void add(T t) {if (elementData =http://www.kingceram.com/post/= null) {elementData = new Object[10];}// 判断是否需要扩容if ((size + 1) - elementData.length> 0) {// 原来容量10int oldCapacity = elementData.length;// 新的容量 10+5;int newCapacity = oldCapacity + (oldCapacity >> 1);// 扩容elementData = http://www.kingceram.com/post/Arrays.copyOf(elementData, newCapacity);}elementData[size++] = t;}public T get(int index) {return (T) elementData[index];}public boolean remove(T value) {for (int i = 0; i < size; i++) {T oldValue = (T) elementData[i];if (oldValue.equals(value)) {int numMoved = size - i - 1;if (numMoved> 0)//removeSystem.arraycopy(elementData, i + 1, elementData, i,numMoved);elementData[--size] = null;return true;}}return false;}public static void main(String[] args) {DemoArraylist arraylist = new DemoArraylist<>();for (int i = 0; i < 100; i++) {arraylist.add("demo" + i);}arraylist.remove("demo2");//arraylist.add("demo11");for (int i = 0; i < arraylist.size; i++) {System.out.println(arraylist.get(i));}////System.out.println(arraylist.get(0));}}
【5. HashMap如何降低Hash冲突概率】9. 源码注释