バイトコードを見ると、どちらも高価になりません。代わりにClassCastExceptions
を作成して投げるという大規模なオーバーヘッドについては心配します。いずれの場合も、が発生します。キャストが失敗した場合はいずれもです。いずれにしても、instanceof
は特にあなたを傷つけることはありません。また、キャストが発生しない場合は、パフォーマンスペナルティが少なくて済むようになります。ここで
はStringに
CharSequence
(インターフェース)として宣言された変数をキャストします
public static void main(java.lang.String...);
Code:
0: ldc #2 // String a
2: astore_1
3: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream;
6: aload_1
7: checkcast #4 // class java/lang/String
10: invokevirtual #5 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
13: return
そしてサブクラスにクラスをキャスト:とにかく
public static void main(java.lang.String...);
Code:
0: new #2 // class A$B
3: dup
4: invokespecial #3 // Method A$B."<init>":()V
7: astore_1
8: getstatic #4 // Field java/lang/System.out:Ljava/io/PrintStream;
11: aload_1
12: checkcast #2 // class A$B
15: invokevirtual #5 // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
18: return
}
、ここinstanceof
の影響です:
public static void main(java.lang.String...);
Code:
0: new #2 // class A$B
3: dup
4: invokespecial #3 // Method A$B."<init>":()V
7: astore_1
8: aload_1
9: instanceof #2 // class A$B
12: ifeq 25
15: getstatic #4 // Field java/lang/System.out:Ljava/io/PrintStream;
18: aload_1
19: checkcast #2 // class A$B
22: invokevirtual #5 // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
25: return
ご覧のとおり、それは単なるバイトコードの追加操作ですon(通常はメモリ内に存在するオブジェクトインスタンスのいくつかの要素をチェックするだけです)とif文のブランチです。
実際には経費があります。この質問は、初心者ではなく、専門家のためのものです。http://www.javaworld.com/article/2076555/build-ci-sdlc/java-performance-programming--part-2--the-cost-of-casting。 htmlの –
私はあなたがコストがないと言ったあなたのコメントを削除参照してください。あなたは完全性のためのあなたの下投票を削除する必要があります。 –
あなたは私の答えを見て、それがあなたの質問に答えるか、それとも何か明確にする必要があるかどうか教えてください。私はdownvotesが必ずしも正当化されていないことに同意するが、それらを削除しようとすると、極端な効率で成功する可能性があります。 – hexafraction