在自定义ArrayList时,笔者模仿ArrayList的动态扩容方法即只要数组内数据的个数等于数组的长度,就将数组的长度增加原先长度的一半,代码献上:
public void add(E obj) {
//判断是否需要扩容
if (size == elementData.length) {
//扩容操作
Object[] newArray = new Object[elementData.length + elementData.length >> 1];
//elementData = Arrays.copyOf(elementData, newArray.length);
System.arraycopy(elementData, 0, newArray, 0, elementData.length);
elementData=newArray;
}
elementData[size++] = obj;
}
细心的童鞋可能已经发现了上段代码的bug所在,还没发现的童鞋要重视了哦,这类bug虽然很少出现,但是可以体现出大家的Java基础。
代码编写完毕,运行一遍,控制台异常:
数组越界异常!动态扩容就是为了解决数组容量不够问题的,一定是上段代码出问题了,检查了一下,代码逻辑正确,看起来似乎没有什么问题,打个断点调试一下吧:
到这里发现新创建的数组newArray的长度没有变成预计的30,一定是这一行代码有问题:
加法运算符的优先级高于移位运算符,所以a+a>>1等价于(a+a)>>1,自然是扩不了容的,修改代码:
再次运行,正常!