删除(Object obj)Vector误解的方法?

时间:2015-08-02 15:03:30

标签: java vector collections

我有:

Vector vector=new Vector();
    vector.addElement("Nguyen");
    vector.addElement("Viet");
    vector.addElement("Jone");
    vector.addElement(28);
    vector.remove(28);
    System.out.println("Vector: "+ vector);

在Vector中,我看到两种方法删除:

  • public boolean remove(Object obj)

  • public synchronized E remove(int index)

我只想使用public boolean remove(Object obj),但运行时会出错。有人可以向我解释为什么?它似乎是Vector的错误方法吗?

4 个答案:

答案 0 :(得分:4)

简答:

索引位置 28 没有元素。您使用的remove方法采用索引位置。要删除值 28 的元素,请使用vector.remove(Integer.valueOf(28));

答案很长:

Java中的Collection(例如Vector)只能保存对象而不是基元。 addElement中的Vector方法采用对象参数。当您说vector.addElement(28)时, 28 的原始int值被装箱到Integer对象中,然后添加到Vector。另一方面remove方法有一个重载形式,它接受int参数,所以当你说vector.remove(28)时,会调用这个版本的方法,试图删除索引位置的元素28。

答案 1 :(得分:2)

您没有发布错误,但我希望它会IndexOutOfBoundsException,对吧?

好的,这里发生了什么,Vector是老式的,早在Autoboxing之前,支持自动取消装箱,反过来向向量中添加一个数字需要显式{ {1}}对象创建。删除 对象元素当然也需要相同。由于这是故事,该类的作者没有问题重载 2个具有相同名称的完全不同的方法,因为它是 完全不同 (不能以任何方式来回投射,参见Effective Java第194页)。

现在,在Java 5中,引入了自动装箱,但只有在真正需要的情况下才会这样做。在您的情况下,添加元素必须 autobox,因为不存在替代方法。相反,删除会产生歧义,因此它会选择更容易的那个,不需要自动装箱,导致调用错误的方法。

解决方案是通过manul拳击显式调用另一个方法:

Integer

答案 2 :(得分:1)

vector.remove(28)尝试从Vector中删除第29个元素(具有索引28)。你的Vector没有那么多元素,所以你得到一个IndexOutOfBoundsException。

您应该考虑是否真的希望您的Vector包含StringInteger s。这通常表明设计不好。

答案 3 :(得分:0)

你必须低于错误

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 28
    at java.util.Vector.remove(Unknown Source)
    at TestInteger.main(TestInteger.java:14)

例外是自我解释的。原因是索引28没有元素

请参阅vector remove with index,但我相信您正在寻找remove object