java集合源代码分析(一)
来源:互联网 发布:直播摄像头美颜软件 编辑:程序博客网 时间:2024/06/06 23:49
(一)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.多线程:非线程安全
- java集合源代码分析(一)
- Java集合类源代码分析二:ArrayList(1)
- Java集合类源代码分析二:ArrayList(2)
- java集合分析思想(一)
- Iperf 源代码分析(一)
- Hadoop源代码分析(一)
- Hadoop源代码分析(一)
- yaffs2源代码分析(一)
- Iperf 源代码分析(一)
- yaffs2源代码分析(一)
- GZIP源代码分析(一)
- VLC源代码分析(一)
- Hadoop源代码分析(一)
- DataTable源代码分析(一)
- Iperf 源代码分析(一)
- java容器--List集合中的体系结构分析(一)
- Java集合源码分析系列-(一)ArrayList源码剖析
- HEVC源代码分析(一)--词法分析
- 地图下面的金矿
- 解决 django+mysql 的乱码问题
- Qt多线程编程
- 平凡一天
- 怎样比较两个集合是否相等
- java集合源代码分析(一)
- iOS 如何在一个应用程序中调用另一个应用程序
- hibernate 正向和反向工程
- hdu1325Is It A Tree?【并差集】
- 黑马程序员java学习日记——面向对象(三)
- cocos2d-x 2.x action动作整理集合
- 白话 __vm_enough_memory,检查内存是否充足
- 数学中求各种多边形的面积
- Ubuntu 12.04安装QQ2012,下载后请根据自己的机器类型,按照下面的32位或64位安装说明安装