You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义泛型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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 18:27:39