美文网首页
Java集合

Java集合

作者: upup果 | 来源:发表于2021-02-03 19:39 被阅读0次
    1. ArrayList扩容机制
      默认构造函数的初始容量为10,为空数组。当执行add方法时,先执行ensureCapacityInternal(size + 1)得到minCapcity,(当 要 add 进第 1 个元素时,minCapacity 为 1,在 Math.max()方法比较后,minCapacity 为 10。), 然后执行ensureExplicitCapacity(int minCapacity),minCapacity - elementData.length > 0成立,会进入 grow(minCapacity) 方法,先计算一个新容量newCapacity = oldCapacity + (oldCapacity >> 1),所以 ArrayList 每次扩容之后容量都会变为原来的 1.5 倍左右。 如果新容量大于MAX_ARRAY_SIZE,进入(执行) hugeCapacity() 方法来比较 minCapacity 和 MAX_ARRAY_SIZE,如果 minCapacity 大于最大容量,则新容量则为Integer.MAX_VALUE,否则,新容量大小则为 MAX_ARRAY_SIZE 即为 Integer.MAX_VALUE - 8。最后调用Arrays.copyOf(elementData, newCapacity)。得到新数组。
    2. LinkedList相关:
      LinkedList是一个实现了List和Deque的双端链表,内部有一个私有类Node,这个类有三个属性,分别是前驱节点(prev),本节点的值(item),后继结点(next)。 add(E e)方法通过linkLast(E e)将元素添加到链表尾部,add(int index,E e)在指定位置添加元素,先检查index是否合法,如果index==size调用linkLast,否则调用linkBefore(e, node(index))。
      addAll(Collection c ):将集合插入到链表尾部。addAll(int index, Collection c) 将集合从指定位置开始插入,通常包括下面四个步骤:
      ①检查index范围是否在size之内
      ②toArray()方法把集合的数据存到对象数组中
      ③得到插入位置的前驱和后继节点
      ④遍历数据,将数据插入到指定位置
      addFirst(E e): 通过linkFirst(E e)将元素添加到链表头部
      addLast(E e): 将元素添加到链表尾部,与 add(E e) 方法一样
      removeLast()在链表为空时将抛出NoSuchElementException,而pollLast()方法返回null。
    3. HashMap
      容量,扩容
      https://mp.weixin.qq.com/s?__biz=MzAwNDA2OTM1Ng==&mid=2453141153&idx=2&sn=f9a5a2a58a8b1d078ab9a2da2c9908bc&scene=21#wechat_redirect
      常见问题
      https://mp.weixin.qq.com/s/ef4oF2Wj8QYfCyxDnFSPMA
      https://mp.weixin.qq.com/s/oRx-8XXbgage9Hf97WrDQQ
      https://mp.weixin.qq.com/s?__biz=MzAwNDA2OTM1Ng==&mid=2453141093&idx=2&sn=2784802c46f56c1fa1a1053c2c52ece0&scene=21#wechat_redirect
      1.7线程不安全:环形链表,更新覆盖
      https://mp.weixin.qq.com/s/k-4UhVJkuDeYSc1iSEMXyA
      右移高16位:
      当数组的长度很短时,只有低位数的hashcode值能参与运算。而让高16位参与运算可以更好的均匀散列,减少碰撞,进一步降低hash冲突的几率。并且使得高16位和低16位的信息都被保留了。而在这里采用异或运算而不采用& ,| 运算的原因是 异或运算能更好的保留各部分的特征,如果采用&运算计算出来的值的二进制会向1靠拢,采用|运算计算出来的值的二进制会向0靠拢
      https://blog.csdn.net/weixin_43842753/article/details/105927912
    4. CurrentHashMap
      https://mp.weixin.qq.com/s?__biz=MzAwNDA2OTM1Ng==&mid=2453141162&idx=1&sn=72976d5ae28ca6e7cdeaef407d3fe2ca&scene=21#wechat_redirect
      https://mp.weixin.qq.com/s/veeef00M6D7JLrmFcCWCUA
      https://snailclimb.gitee.io/javaguide/#/docs/java/collection/ConcurrentHashMap%E6%BA%90%E7%A0%81+%E5%BA%95%E5%B1%82%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E5%88%86%E6%9E%90
      源码
      https://mp.weixin.qq.com/s?__biz=MzAwNDA2OTM1Ng==&mid=2453141985&idx=2&sn=875412f607c18fa6ba6aa0b0862b7fe6&scene=21#wechat_redirect

    相关文章

      网友评论

          本文标题:Java集合

          本文链接:https://www.haomeiwen.com/subject/ombktltx.html