在Java 6中,向下转换的成本有多高?

sta*_*lar 2 java casting upcasting

有一个接收类型参数的方法,Collection它需要使用类中的一些方法,List当它与该参数一起使用时.在速度方面,上涨是否昂贵?

List<Stuff> list = (List<Stuff>) collection;
Run Code Online (Sandbox Code Playgroud)

我还要注意,collection在此之后永远不会使用该对象,只会list在Oracle Java 1.6上编译和运行该对象.

Mar*_*nik 13

实际基准给出了严肃的答案.例如,我使用了这个jmh目标代码:

public class Benchmark1
{
  static final List<Integer>[] lists = new List[10000]; static {
    for (int i = 0; i < lists.length; i++) {
      lists[i] = new ArrayList<Integer>(1);
      lists[i].add(1);
    }
  }
  static final Collection<Integer>[] colls = new Collection[lists.length]; static {
    for (int i = 0; i < colls.length; i++) colls[i] = lists[i];
  }


  @GenerateMicroBenchmark
  public long testNoDowncast() {
    long sum = (long)Math.random()*10;
    for (int i = 0; i < lists.length; i++) sum += lists[i].get(0);
    return sum;
  }
  @GenerateMicroBenchmark
  public long testDowncast() {
    long sum = (long)Math.random()*10;
    for (int i = 0; i < colls.length; i++) sum += ((List<Integer>)colls[i]).get(0);
    return sum;
  }
}
Run Code Online (Sandbox Code Playgroud)

jmh提供以下结果:

Benchmark          Mode Thr    Cnt  Sec         Mean   Mean error    Units
testDowncast      thrpt   1      5    5       18.545        0.019 ops/msec
testNoDowncast    thrpt   1      5    5       19.102        0.655 ops/msec
Run Code Online (Sandbox Code Playgroud)

如果您需要解释,则如下:没有任何区别.

  • +1我希望有这篇文章的婴儿. (4认同)
  • "差异为4%" - 置信区间更具相关性.由于平均值±1 SD(来自MSE)重叠,因此存在*无*统计学上显着的差异. (2认同)