面试中的源码

set 不允许重复 无序
hashset->hashmap LinkedHashSet—LinkedHashMap TreeSet----TreeMap实现了SortedSet接口
return map.put(e, PRESENT)==null; //PRESENT始终是一个new object
将元素作为key存储,这也是为什么Set元素无序,不重复,不为null的原因

Collections.synchronizedList
List ArrayList、LinkedList、Vector
ArrayList 操作读取操作效率高,基于数组实现的,可以为null值,可以允许重复元素,有序
add ensureExplicitCapacity 扩容1.5 arraycopy(),我们可以发现:该方法是由C/C++来编写的 [size++] = e
删除元素时不会减少容量,若希望减少容量则调用trimToSize() remove 设置为null,让Gc回收 clear to let GC do its work
LinkedList 由双链表实现,增删快 都是从头或者尾遍历得到的!!
add 就是新加Node pre e next
get // 如果索引位置靠链表前半部分,从头开始遍历 Node x = first for循环次数!!获取
remove 先判断是否是头尾节点

HashMap 数组+链表+红黑树64 8 是O(lgn) 任意一结点到每个叶子结点的路径都包含数量相同的黑结点。/每个红色结点的两个子结点一定都是黑色
DEFAULT_LOAD_FACTOR = 0.75f;//加载因子默认0.75 DEFAULT_INITIAL_CAPACITY = 16;//默认初始容量(数组大小)
transientEntry[] table;//存储数据的entry数组 int threshold;//临界值=加载因子*初始容量(当size大于临界值就会出现数组扩充到原来2 倍)
Node hash key value next
put inflateTable putForNullKey indexFor//hash计算位置 table[i]链表|红黑树 resize
get getForNullKey indexFor//hash计算位置hash & (table.length-1) table[i]链表

ConcurrentHashMap key不能为空
sizeCtl 负数代表正在进行初始化或扩容操作 -1代表正在初始化 -N 表示有N-1个线程正在进行扩容操作
put //死循环 table[i] 没数据casTabAt 有就synchronized 链表|树instanceof TreeBin 添加成功在判断是否转换treeifyBin

ReentrantLock NonfairSync
lock ->cas改变state->tryAcquire(以cas方式获取,如果当前线程重入了修改state)->失败addWaiter->cas加入双向链表(头尾)->acquireQueued(for循环 成功获取了锁并成功将自身设置为头结点,就会跳出for循环.否则阻塞LockSupport.park)
unlock tryRelease(释放锁(state-1)) state=0, unparkSuccessor(h); //唤醒同步队列中被阻塞的线程

CountDownLatch doneSignal = new CountDownLatch(N); N设置为state 相当于重入次数 await直到state为0

synchronized monitorenter、monitorexit Wait Set:哪些调用 wait方法被阻塞的线程被放置在这里 Owner
Contention ->entry->ondeck->owner->waite set

AutoInteger voliate num!!
public final int getAndIncrement() {
for (;😉 { //死循环
int current = get();
int next = current + 1;
if (compareAndSet(current, next))
return current;
}
}

不开异步 new thread 主线程都要等方法执行完!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值