0

ケース A:

List<String> MyList;
while(index<100) {
    MyList = MyObject.get(MyIndex);
}

ケース B:

List MyList;
while(index<100) {
    MyList = (List<String>) MyObject.get(MyIndex);
}

上記のうち、どちらが速いでしょうか?

ケース B では、動的キャストがループ全体で発生すると想定しています。したがって、2番目は最初のものよりも遅くなる可能性があるというのが私の仮定でした。

どちらがより速くできるか教えてください。

4

4 に答える 4

1

まず第一に、ジェネリックスはコンパイル時の機能です。Javaランタイムは、ジェネリックスとは何の関係もありません。ListはStringオブジェクトのみを保持し、他には何も保持しないと常に確信しているため、ケースAを使用することをお勧めします。これにより、実行時にClassCastExceptionを回避できます。これは、リストにStringオブジェクトのみが含まれ、他には何も含まれないことが常に確実であるためです。

どちらの場合もJavaランタイムに認識されているListオブジェクトは同じであるため(List MyList;)、両方のアプローチで同じ実行時間がかかると思います。ケースA:リストMyList; ケースBと同じように、ListMyListとしてJVMに渡されます。

于 2013-03-04T09:40:32.680 に答える
1

どちらもパフォーマンスが同じである必要があります。最初のバージョンは JVM キャスト命令を作成しますが、コンパイラによって暗黙的に追加されます。どちらの場合も、ランタイム操作は List へのキャストです。ジェネリック型は実行時に保持されません。

これは、バイトコードを確認することで確認できます。これは、両方のバージョンで同一である必要があります。

于 2013-03-04T09:32:53.220 に答える
1

Java ジェネリックは、コンパイル時の抽象化です。それらがバイトコードに残っているという証拠はありません。これらは開発を単純化するだけで、パフォーマンスには影響しません。バイトコードでは、コードの最初のサンプルは 2 番目のサンプルとまったく同じように見えます。Javac はキャストを挿入するだけです。

于 2013-03-04T09:33:09.527 に答える