Java中如何删除Vector元素?自定义删除方法存在两位数删除错误
问题根源分析
你遇到的问题其实是Java方法重载的典型陷阱——Vector的remove方法有两个重载版本,而你传入int类型参数时,调用的是按索引删除的版本,而非按元素值删除的版本。
具体来说:
remove(int index):删除指定索引位置的元素remove(Object o):删除第一个匹配的元素对象
你的代码里vec.remove(no - 1),因为no是int类型,JVM会默认匹配remove(int index)重载。当no是单数字(比如5),no-1=4,如果刚好索引4的元素就是你要删的5,那看起来是对的,但这完全是巧合;当no是双数字(比如10),no-1=9,这时候你删除的是索引9的元素,而不是值为10的元素,自然就删错了。
解决方案
根据你的需求(删除值为no的元素),我们需要明确调用按元素删除的重载方法,这里有两种可行方式:
1. 包装int为Integer对象
把int类型的no包装成Integer,这样JVM就会匹配remove(Object o)方法:
public boolean delete(int no) { if (!search(no)) { return false; } // 将int包装为Integer,触发按元素删除的重载 vec.remove(Integer.valueOf(no)); // 注意:Vector本身有size()方法,不需要自己维护size变量,建议删除自定义的size字段 return true; }
2. 处理重复元素的情况
如果你的Vector中可能存在多个值为no的元素,上面的方法只会删除第一个匹配的。如果需要删除所有匹配元素,建议用迭代器遍历删除(避免并发修改异常):
public boolean deleteAll(int no) { boolean isRemoved = false; Iterator<Integer> iterator = vec.iterator(); while (iterator.hasNext()) { Integer element = iterator.next(); if (element.equals(no)) { iterator.remove(); isRemoved = true; } } return isRemoved; }
额外建议
另外提一句:Vector是Java早期的集合类,它的所有方法都是同步的,效率较低。如果你的场景不需要线程安全,建议用ArrayList替代Vector;如果需要线程安全,可以用CopyOnWriteArrayList或者手动同步ArrayList,性能会更好。
内容的提问来源于stack exchange,提问作者Wolk
相关产品推荐
相关产品推荐

