java集合
文章平均质量分 63
社会废人
万物皆虚,万事皆允
展开
-
h & (n- 1) 求余数的说明
通过以上过程,可以发现相减时,(从左向右看)被减数的1在不断向后移动,最终结果一定是将1移动到与减数最高位1的后方;即使在最大余数为3时,结果的最高位1也依旧处于减数的最高位1后方(0011与0100)。总结,当n为2的幂数时,n - 1正好是最大余数;当n不是2的幂数时,例如7,它最大的余数为6(0110),最后一位不是1,不能符合上述规则(因为6本身就有一位是0)。因此,当最大余数的所有位置都是1时,我们可以通过与运算获取余数,因为这个余数一定是将某一个或某些1置为了0。n = 7时则行不通。原创 2024-03-04 12:26:32 · 269 阅读 · 0 评论 -
CopyOnWriteArrayList类为何能保证线程安全
CopyOnWriteArrayList与ArrayList相比多出了CopyOnWrite部分,这也反映出了前者在底层所使用的原理,即写入时复制策略。 CopyOnWrite,简称COW,是一种优化策略。使用COW来实现读写分离操作,其原理是当多个线程对同一个资源的操作,分为读操作和写操作。 对于读操作来说,不需要同步,因为大家读到的都是一样的。 对于写操作来说,需要同步,因为你改我也改很有可能出现覆盖导致数据出错,因此需要保证在同一时间只有一个线程在操作。 基于此原理,CopyOnW原创 2021-08-18 16:42:23 · 584 阅读 · 0 评论 -
HashMap底层tableSizeFor(int i)方法变动
HashMap底层中tableSizeFor(int i)方法作用是确保底层数组扩容时新的数组容量为2的幂次数,即2n。jdk1.8:static final int tableSizeFor(int cap) { int n = cap - 1; n |= n >>> 1; n |= n >>> 2; n |= n >>> 4; n |= n >>> 8; n |= n >&g原创 2021-08-04 15:13:37 · 138 阅读 · 0 评论 -
LinkedList中addAll(Collection<? extends E> C)方法解析
本文长度还算比较长,如果你觉得过于冗长,可以你可以只看源码和图片部分。public boolean addAll(int index, Collection<? extends E> c) { checkPositionIndex(index); Object[] a = c.toArray(); int numNew = a.length; if (numNew == 0) return false;原创 2021-07-29 18:54:51 · 1061 阅读 · 0 评论 -
关于Java中ArrayList最大容量Integer.MAX_VALUE-8中的8所代表的意义
关于为何要减8这个问题,下面还是作者的解释:/*** The maximum size of array to allocate (unless necessary).* Some VMs reserve some header words in an array.* Attempts to allocate larger arrays may result in* OutOfMemoryError: Requested array size exceeds VM limit*/翻译过来就是原创 2021-07-22 01:48:19 · 1325 阅读 · 4 评论