数组元素java集合源代码分析(一)
工作之余抽点时间出来写写博文,希望对新接触的朋友有帮助。今天在这里和大家一起学习一下数组元素
(一)ArrayList
1.底层结构:是数组,初始大小是10;
2.扩容:int newCapacity = (oldCapacity * 3)/2 + 1; 可通过ensureCapacity操纵初始化大小;
数组进行扩容时,会将老数组中的元素重新拷贝一份到新的数组中;
3.存储:将指定的元素添加到此列表的尾部。也可指定添加次序;
4.是不是答应重复:答应重复,判断标准equals相称;
5.是不是答应寄存null:答应;
6.多线程:非线程安全
Fail-Fast机制:?
7.补充:
实现线程安全的方法
1、继承Arraylist,然后重写或按需求编写自己的方法,这些方法要写成synchronized,在这些synchronized的方法中调用ArrayList的方法。
2、List list = Collections.synchronizedList(new ArrayList());
(二)HashMap
1.底层结构:数组和链表的结合体;
Entry就是数组中的元素,每个 Map.Entry 其实就是一个key-value对,它持有一个指向下一个元素的引用,这就构成了链表;
从上面的源代码中可以看出:当我们往HashMap中put元素的时候,先根据key的hashCode重新盘算hash值,根据hash值失掉这个
元素在数组中的位置(即下标),如果数组该位置上已寄存有其他元素了,那么在这个位置上的元素将以链表的形式寄存,
新加入的放在链头,最早加入的放在链尾。如果数组该位置上没有元素,就直接将该元素放到此数组中的该位置上
2.扩容:证初始化时HashMap的容量老是2的n次方,即底层数组的长度老是为2的n次方
那么HashMap什么时候进行扩容呢?当HashMap中的元素个数超过数组大小*loadFactor时,就会进行数组扩容,
loadFactor的默认值为0.75,这是一个折中的取值。也就是说,默认情况下,数组大小为16,那么当HashMap中
元素个数超过16*0.75=12的时候,就把数组的大小扩展为 2*16=32,即扩大一倍
3.是不是答应重复:key不答应重复,判断标准equals相称;
4.是不是答应寄存null:答应使用null值和null键;
5.多线程:非线程安全
Fail-Fast机制:?
(三)hashset
1.底层结构:是hashmap(封装了hashmap),使用默认初始容量为16和加载因子0.75
2.扩容:int newCapacity = (oldCapacity * 3)/2 + 1; 可通过ensureCapacity操纵初始化大小;
数组进行扩容时,会将老数组中的元素重新拷贝一份到新的数组中;
3.存储:同HashMap ,对此set中元素进行迭代的迭代器。返回元素的次序并非特定的
value值是static final Object PRESENT = new Object()
而且:新添加的Entry的value会将覆盖原来Entry的value,但key不会有任何转变, 因此如果向HashSet中添加一个已存在的元素时,新添加的集合元素将不会被放入HashMap中, 原来的元素也不会有任何转变,这也就满意了Set中元素不重复的特性。
4.是不是答应重复:不答应重复
5.是不是答应寄存null:答应;
6.多线程:非线程安全
文章结束给大家分享下程序员的一些笑话语录:
姿势要丰富,经常上百度!