关于版本的收集方法> = Java 5

时间:2013-02-20 20:26:23

标签: java autoboxing

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

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

此致 Sudhakar Chavali

3 个答案:

答案 0 :(得分: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]

答案 1 :(得分:3)

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

此版本删除第二个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

答案 2 :(得分:3)

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

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

编写remove(int)时会调用remove(5);

请注意,Vector在大多数情况下都已过时。