廊坊模板建站代理,wordpress字不能显示,廊坊做网站电话,免费的模板下载先给大家看一下关系图以免大家一头雾水找不着北: 1.不少人对ArrayList集合的底层代码存在误区#xff08;包括一些面试官#xff09;
误区1#xff1a;ArrayList集合的底层是数组结构的#xff0c;数组默认长度为10。
误区2#xff1a;当数组添加满了之后会自动扩容为1.…先给大家看一下关系图以免大家一头雾水找不着北: 1.不少人对ArrayList集合的底层代码存在误区包括一些面试官
误区1ArrayList集合的底层是数组结构的数组默认长度为10。
误区2当数组添加满了之后会自动扩容为1.5倍。标红的就代表错误
正确的ArrayList底层原理
正解1利用空参构造创建的集合在底层会创建一个默认长度为0的数组
正解2在添加第一个元素时底层会创建一个新的长度为10的数组此时数组中所有元素都为null
元素的值nullnullnullnullnullnullnullnullnullnullindex0123456789 正解3当这十个元素存满了数组会自动扩容扩容时会创建一个新的数组长度为老数组的1.5倍再拷贝老数组的所有元素到新数组
正解4如果一次添加多个元素即使扩容1.5倍也存不下新创建的数组长度会以实际为准。 源码剖析打开idea跟着我做你一定可以学会看源码
先假设我们要调用add方法list.add(xxx),后面你要拿着里面的元素带入到方法内部
CtrlN在搜索框输入ArrayList回车,一定要是uil包下的
public ArrayList() {this.elementData DEFAULTCAPACITY_EMPTY_ELEMENTDATA;Ctrl鼠标左键单击跟进
}private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA {};
{}表示DEFAULTCAPACITY_EMPTY_ELEMENTDATA是一个空数组表示默认长度为0。elementData 是 ArrayList 用来存储元素的数组。
Alt数字键7展开ArrayList所有方法找到两个add方法
public boolean add(E e) {modCount; // 1. 增加修改计数器以便在集合被修改时进行监控。add(e, elementData, size); // 2. 调用私有的 add 方法将元素 e 添加到 elementData 数组中。return true; // 3. 返回 true 表示元素已成功添加。
}private void add(E e, Object[] elementData, int s) {if (s elementData.length) // 1. 检查是否需要扩容。elementData grow(); // 2. 如果需要扩容调用 grow 方法扩展数组。elementData[s] e; // 3. 将新元素 e 放入 elementData 数组的正确位置。size s 1; // 4. 更新集合的大小size。
}Ctrl鼠标左键单击跟进找到两个grow方法
private Object[] grow() {return grow(size 1); // 1. 调用带有最小容量参数的 grow 方法传入 size 1 作为新的最小容量。
}private Object[] grow(int minCapacity) {int oldCapacity elementData.length; // 1. 获取当前数组的容量。if (oldCapacity 0 || elementData ! DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {int newCapacity ArraysSupport.newLength(oldCapacity,minCapacity - oldCapacity, /* minimum growth */oldCapacity 1 /* preferred growth */); // 2. 计算新的容量。注意这里的右移符号就是1.5倍扩容的关键右移一次就除以2假设老容量到达了1010/2就是默认oldCapacity新增容量的大小5新增完之后新数组newCapacity的大小就变成了原来的1.5倍即15return elementData Arrays.copyOf(elementData, newCapacity); // 3. 创建一个新数组并复制旧数组的元素。} else {return elementData new Object[Math.max(DEFAULT_CAPACITY, minCapacity)]; // 4. 如果数组是空的则创建一个具有默认最小容量的新数组。}
}Ctrl鼠标左键单击跟进找到newLength方法
public static int newLength(int oldLength, int minGrowth, int prefGrowth) {// 定义一个静态方法用于根据旧长度、最小增长量和首选增长量计算新的长度。int prefLength oldLength Math.max(minGrowth, prefGrowth); // 计算首选长度即将 oldLength 加上 minGrowth 和 prefGrowth 中的较大值; 这个计算可能会导致整数溢出。if (0 prefLength prefLength SOFT_MAX_ARRAY_LENGTH) { // 检查首选长度是否为正数且在允许的最大长度范围内。return prefLength; // 如果首选长度在范围内则返回这个首选长度。} else {return hugeLength(oldLength, minGrowth); // 如果首选长度超出了范围则调用另一个方法来确定一个更大的有效长度。}
}相信你一定能看懂 好了今天的学习就到这了如果看不懂源码的一定要一步一步推导别着急一下看完学习应该是以进步为目的的三分钟的进步胜过别人24小时的原地踏步只要有进步就算没有理想那也不叫咸鱼加油!