510
1.如何排查异常
先写出对的,再进行取反。
2.Arraylist使用事项
可以放空元素,并且可以加多个
底层是用数组实现的
解读源码
ArrayList基本等同vector,但是线程不安全,但是快
Synchronize做线程互斥的
3.ArrayList的扩容机制
先说结论,再分析源码
Debug 画图
有些难度
(1)维护数组
数据最终存在elementdata
属于Object的数组elementdata
(2)当创建ArrayList对象
构造器
传进去一个整数
则初始化 刚开始是0,空间为0
(就是总会有冗余)
transient 表示瞬间的;短暂的 ;表示属性不会被序列化
510Arraylist底层执行机制
步骤:(抑制警告
解读源码
无参构造器创建ArrayList对象
for循环,添加1-10个数据
构造器是什么运行的
执行的是
默认的elementdata是什么样子
第一次初始化就是一个空数组
第一次添加会进行装箱
先进到integer
再进入到add方法(确认capacity容量如何)
执行添加的一个方法
不是直接上来就添加
因为可能内存不够
确认大小
是不是够我添加一个数据
先确定是否要扩容
然后第二步才会把
还要确定要不要真正要扩容
modCount++记录集合被修改的次数
每一次添加都要去瞅一眼
第一次进来,0+0还是0
第一次不是用扩容
先把其大小赋值
按照1.5倍来扩容
第一次很遗憾,不扩容
第二次再扩
Huge
Arrays.copyOf
默认还是空)
//默认情况下,debug显示的数据是简化后的
如果希望看到完整的,需要做设置
不然看到的是被阉割的数据
可以看出扩容并不是随便扩容的
编写程序时的快捷方法也是人的逻辑实现的
都是人写的为了让后来者更加方便
511底层源码2
构造器 initialcapacity
分析有参构造
创建了指定大小的elementdata数组
512 vector
最大特点:线程安全
synchronize使线程同步
(同时操作)
513 vector底层源码
扩容机制
514linkedlist底层结构
链表和队列
添加和删除效率比较高,涉及到扩容,不是通过数组来实现
简单的双向链表
“岁月如鎏金般闪烁”
515linkedlist源码分析
crud增删改查
为什么要看源码,是他的底层实现逻辑与方法
Remove(指定删除位置)
默认删除的是第一个linkedlist.remove( )
//first = next
最后,想谈谈我目前对源码的认识,为什么老韩一直告诫我们要去看源码,因为你只有看源码才可能会明白底层,不光知道这个方法具体是做什么的,能够实现什么效果,我们还要了解其具体是怎么实现,因为底层的方法也是前人写的,他们的方法、接口,之后添加到了编译器中,代表了这个方法的常用性,并且为什么这个写法,肯定也是经历了无数次的检验。
那么我们能够去看一些好的代码书写思路,并且弄明白其具体是怎么实现的,必然会大大提高我们的水平,这就证明了为什么老韩说:“想拿高薪,就要看源码。”因为你只有懂得了底层运行机制,你才能理解的相当透彻,用起来得心应手,并且继承前人的优质思想不断向后推进。