Java如何正确实现数组清空,使数组大小变为0?
修复方案
问题根源
你使用的是部分填充数组实现,核心逻辑是底层数组的长度是最大容量,需要额外字段记录实际存储的有效元素数量,你的代码目前有两个核心错误:
- 缺少
size字段记录有效元素个数,现有的size()方法大概率直接返回了底层数组的长度(容量),和实际有效元素数无关 - 现有
empty()方法仅将元素置0,没有重置有效元素计数,所以查询大小始终返回非0值 - 额外问题:当前构造方法添加了
void返回值,实际变成普通成员方法,new IntBag()时不会执行初始化逻辑,且赋值方向完全颠倒
修复步骤
1. 新增有效元素计数字段
在IntBag类的属性定义中新增size字段:
public class IntBag { private int capacity; private String fileName; private int[] bag; // 新增:记录实际有效元素个数 private int size;
你的size()方法直接返回该字段即可:
public int size() { return size; }
2. 修复empty()方法
重置有效元素计数为0,数组元素置0是可选操作,不影响大小统计:
public void empty() { Arrays.fill(bag, 0); // 核心:重置有效元素计数为0 this.size = 0; }
3. 修复构造方法错误
去掉构造方法的void返回值,修正赋值方向,初始化size为0:
// 无参构造 public IntBag() { this.capacity = 20; this.bag = new int[capacity]; this.size = 0; } // 指定容量的构造 public IntBag(int capacity) { this.capacity = capacity; this.bag = new int[capacity]; this.size = 0; } // 复制构造 public IntBag(IntBag other) { this.capacity = other.capacity; this.fileName = other.fileName; this.bag = Arrays.copyOf(other.bag, other.capacity); this.size = other.size; }
4. 联动所有操作方法更新size
后续实现add/delete等方法时,需要同步更新size字段:
- 添加元素成功后
size += 1 - 删除元素成功后
size -= 1 - 确保
size永远不会超过capacity,也不会小于0
5. 优化main方法初始化逻辑
不需要手动创建数组赋值给intBag.bag,直接用构造方法初始化即可:
// 原来的初始化代码替换为 IntBag intBag = new IntBag(20);
内容的提问来源于stack exchange,提问作者user16854661
相关产品推荐
相关产品推荐

