JAVA基础集合框架【四】HashMap之源码分析tableSizeFor
文章首发于:clawhub.club
HashMap中的tableSizeFor方法返回给定目标容量的2次幂。感觉这里面设计的算法真是精妙,数学真是奇妙的学科。源码如下:
123456789101112/** * Returns a power of two size for the given target capacity. */ static final int tableSizeFor(int cap) { int n = cap - 1; n |= n >>> 1; n |= n >>> 2; n |= n >>> 4; n |= n >>> 8; n |= n >>> 16; return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1; }
源码中涉及到无符号右 ...
JAVA基础集合框架【四】HashMap之源码分析开始
文章首发于:clawhub.club
HashMap中的常量12345678910111213141516171819202122232425262728293031323334/** * 默认初始容量—必须是2的幂。 * 为啥不直接写16?? */static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16: 又叫做,亦称/** * 最大容量,如果较高的值由带参数的任何构造函数隐式指定,则使用该值。必须是2的幂 <= 1<<30。 */static final int MAXIMUM_CAPACITY = 1 << 30;/** * 构造函数中没有指定时使用的负载因子。 */static final float DEFAULT_LOAD_FACTOR = 0.75f;/** * 使用树(而不是列表)来设置桶的计数阈值。当向至少具有这么多节点的桶添加元素时,桶将转换为树。 * 该值必须大于2,并且应该至少为8,以便与树木移除中关于收缩后转换回普通桶的假设相吻合。 * 为啥不 ...
JAVA基础集合框架【四】HashMap之源码翻译-红黑树部分
文章首发于:clawhub.club
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951 ...
JAVA基础集合框架【四】HashMap之源码翻译-额外部分
文章首发于:clawhub.club
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951 ...
JAVA基础集合框架【四】HashMap之源码翻译-基础部分
文章首发于:clawhub.club
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951 ...
JAVA基础集合框架【三】ArrayList与LinkedList的区别
文章首发于:clawhub.club
线程安全ArrayList 和 LinkedList 都是不同步的,也就是不保证线程安全;
数据结构LinkedList 是基于双向链表实现的,ArrayList 是基于数组实现的。
快速随机访问ArrayList 支持随机访问,所以查询速度更快,LinkedList 添加、插入、删除元素速度更快。
内存空间占用ArrayList的空间浪费主要体现在在list列表的结尾会预留一定的容量空间,LinkedList使用Node来存储数据每个Node中不仅存储元素的值,还存储了前一个 Node 的引用和后一个 Node 的引用,占用内存更多。
遍历方式选择实现了RandomAccess接口的list,优先选择普通for循环 ,其次foreach,未实现RandomAccess接口的list, 优先选择iterator遍历(foreach遍历底层也是通过iterator实现的),大size的数据,千万不要使用普通for循环。
JAVA基础集合框架【二】LinkedList之源码分析
文章首发于:clawhub.club
介绍
LinkedList实现了 List 接口:可以作为链表(常用的方法有 add()、remove()、get())使用。
LinkedList实现了 Deque(双端队列)接口:可以作为队列(常用的方法有 offer()、poll()、peek())使用(FIFO)。
LinkedList内部是双向链表结构,从链表的任一端都可以遍历,所以 LinkedList 还可以作为堆栈(常用的方法有 push()、pop())使用。
属性都不参与序列化。
123456789101112131415transient int size = 0;/** * Pointer to first node. * Invariant: (first == null && last == null) || * (first.prev == null && first.item != null) */transient Node<E> first;/** * Pointer to last ...
JAVA基础集合框架【二】LinkedList之源码翻译
文章首发于:clawhub.club
基于JDK1.8:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192 ...
JAVA基础集合框架【一】ArrayList之扩容策略
文章首发于:clawhub.club
集合扩容就是集合容量大小不能满足需要存储数据的数量,而需要将elementData 容器大小增大,以存储更多的元素。ArrayList的扩容机制提高了性能,如果每次只扩充一个,那么频繁的插入会导致频繁的拷贝,降低性能,而ArrayList的扩容机制避免了这种情况。如有必要,增加此ArrayList实例的容量,以确保它至少能容纳元素的数量。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 // 集合最大容量 private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;// 默认空数组private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; ...
JAVA基础集合框架【一】ArrayList之初始容量分析
文章首发于:clawhub.club
在看ArrayList源码的时候,看到两个常量没理解:EMPTY_ELEMENTDATA和DEFAULTCAPACITY_EMPTY_ELEMENTDATA
1234567891011/** * Shared empty array instance used for empty instances. */private static final Object[] EMPTY_ELEMENTDATA = {};/** * Shared empty array instance used for default sized empty instances. We * distinguish this from EMPTY_ELEMENTDATA to know how much to inflate when * first element is added. */private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
都 ...