自定义泛型MyArrayList无输出问题排查及元素添加计时功能实现求助
首先咱们直接戳核心问题——你的元素添加循环根本没执行起来!这就是程序无输出的关键原因,咱们一步步拆解修复:
1. 循环条件错误(导致零元素添加)
在ListTester的main方法里,你写的循环逻辑完全搞反了:
for (int i = 0; i < arrayList.size(); i++) { arrayList.add(array[i]); }
刚初始化的MyArrayList的size()是0,循环条件i < 0直接不成立,循环体一次都没跑。你费劲生成的随机数组,连一个元素都没加到列表里,最后打印arrayList时返回的是空字符串,耗时也是0,自然看起来像没输出。
修复方案:改成遍历你生成的array数组,或者直接循环n次:
// 方案一:增强for循环遍历数组 for (int num : array) { arrayList.add(num); } // 方案二:按数组长度循环 for (int i = 0; i < array.length; i++) { arrayList.add(array[i]); }
2. 随机数生成的优先级bug
你生成随机数的代码有个隐蔽的逻辑错误:
array[i] = (int)Math.random() *2*n +1;
Java运算符优先级里,(int)只作用于Math.random(),而Math.random()返回0~1的浮点数,转成int后就是0,最终所有元素都是0*2*n +1 =1,完全不是你想要的随机数。
修复方案:把整个随机数表达式括起来再转int:
array[i] = (int)(Math.random() * (2 * n + 1));
3. 其他潜在问题修复(避免后续踩坑)
除了上面两个关键问题,你的MyArrayList还有几个小bug需要修正:
(1)add(int index, E element)的元素移动逻辑错误
原代码的移动逻辑会把null值覆盖到有效元素里:
for (int i = size-1 ; i >= index ; i--) { array[i] = array[i+1]; }
当i = size-1时,i+1等于size,而array[size]是未赋值的null,会导致最后一个有效元素被改成null。正确的移动逻辑应该是从末尾开始往前挪:
public void add(int index, E element) { if (!arrayFull()) { // 从最后一个空位开始,把元素往后挪一位 for (int i = size; i > index; i--) { array[i] = array[i-1]; } array[index] = element; size++; } else { resize(0); add(index, element); } }
(2)clear()方法的错误实现
原代码把array设为null,之后调用add()会直接抛NullPointerException,应该重新初始化数组:
public void clear() { array = new Object[INITIAL_CAPACITY]; size = 0; }
(顺便提一句,原clear()是private的,如果你想外部调用,建议改成public)
(3)remove(Object o)的空指针风险
原代码用array[i].getClass() == o.getClass()判断,如果array[i]是null会直接抛空指针异常,而且对于包装类(比如Integer),用equals更符合List的预期行为:
public boolean remove(Object o) { for (int i = 0; i < size; i++) { if (o == null) { if (array[i] == null) { remove(i); return true; } } else { if (o.equals(array[i])) { remove(i); return true; } } } return false; }
修正后的运行效果
当你修复了循环条件和随机数生成后,运行ListTester就能看到打印出的随机元素列表,以及对应的纳秒级添加耗时了。
内容的提问来源于stack exchange,提问作者Kevin Shaughnessy

