0

我有一个疑问,想知道 JRE 可能使用了哪个类方法来删除下面代码中的对象。因为 remove 有两个签名 remove(int) 和 remove(Object)。作为 AutoBoxing 功能的一部分,这里的 int 在添加到 Collection 时将被视为 Integer。在这种情况下,哪个 remove 方法将获得更高的优先级,为什么?请分享原因....

    Vector v=new Vector();
    for(int i=0;i<10;i++)
    {
        v.add(i);           
    }       
    v.remove(5); 
    System.err.println(v);

问候 Sudhakar Chavali

4

3 回答 3

3

它拿起索引一

package com.jigar.stackoverflow.question.java;

public class VectorAutoBox {
    public static void main(String[] args) {
        Vector vector = new Vector();
        vector.add(1);
        vector.add(5);
        vector.add(2);
        vector.add(3);
        vector.add(4);
        vector.add(6);
        System.out.println(vector);
        vector.remove(5);
        System.out.println(vector);
    }
}

输出

[1, 5, 2, 3, 4, 6]
[1, 5, 2, 3, 4]
于 2013-02-20T20:30:30.517 回答
3

在不构造 Integer 类的实例的情况下,参数是一个 int,Vector 的方法可以直接处理它而无需自动装箱。编译器使用Java 语言规范中详述的最简单方法。

这个版本删除了第二个 Integer (index = 1),因为它明确地是一个 Integer:

import java.util.Vector;

public class VectorAutoBox {
    public static void main(String[] args) {
        Vector vector = new Vector();
        vector.add(1);
        vector.add(5);
        vector.add(2);
        vector.add(3);
        vector.add(4);
        vector.add(6);
        System.out.println(vector);
        vector.remove( new Integer( 5 )); // case 1
//      vector.remove( 5 );               // case 2
        System.out.println(vector);
    }
}

案例 1 的输出:

[1, 5, 2, 3, 4, 6]
[1, 2, 3, 4, 6]      value '5' at index 1 removed

案例 2 的输出:

[1, 5, 2, 3, 4, 6]
[1, 5, 2, 3, 4]      value '6' at index 5 removed
于 2013-02-20T20:35:28.750 回答
3

JLS #15.12.2中详细说明了确定哪些方法适用的规则。实际上,不需要装箱/拆箱的方法优先于需要装箱/拆箱操作的方法:

  • 第一阶段(第 15.12.2.2 节)执行重载决议,不允许装箱或拆箱转换,或使用变量 arity 方法调用。如果在此阶段没有找到适用的方法,则处理继续到第二阶段。
  • 第二阶段(第 15.12.2.3 节)执行重载决议,同时允许装箱和拆箱,但仍排除使用变量 arity 方法调用。

写的时候这么remove(int)remove(5);

请注意,对于大多数用途,Vector 已过时。

于 2013-02-20T20:38:20.647 回答