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

时间:2013-07-20 16:09:24

标签: java casting upcasting

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

List<Stuff> list = (List<Stuff>) collection;

我还要注意,collection对象在此之后永远不会被使用,只有list,并且它将在Oracle Java 1.6上编译和运行。

1 个答案:

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

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

如果您需要口译,请注意以下事项:没有任何区别