Java の switch ステートメントにはいくつのケースが考えられますか? たとえば、整数をチェックしている場合、いくつのケースブロックが可能ですか?
8 に答える
最初に遭遇する可能性が最も高い限界は、クラスごとの定数プール内のエントリの最大数である 65535 の限界です。これにより、小さな複雑さの数千のケース ブロックが可能になります。定数プールには、クラスで少なくとも 1 回使用される数値または文字列リテラルごとに 1 つのエントリが含まれますが、すべてのフィールド、メソッド、および/またはクラス参照に対して 1 つ以上のエントリも含まれます。定数プールにも存在します。つまり、メソッド参照エントリは、メソッドのシグネチャの文字列エントリへの参照と、宣言するクラスのクラス エントリへの参照で構成されます。クラス エントリ自体も、クラス名の文字列エントリを参照します。
参照: Java 仮想マシンの制限およびJava 仮想マシン仕様の定数プール
case ブロック内のコードを無視または再利用するスイッチの絶対上限は、2^30 ケースよりわずかに小さいです。これは、各ケースには符号付き 32 ビット整数 ( tableswitchおよびlookupswitch命令を参照) であるジャンプ ターゲットがあり、4 バイトが必要であるためです。各メソッドのバイト コード サイズは 2^32 バイト弱に制限されています。これは、バイト コードがコード属性にラップされ、属性の長さが符号なし 32 ビット整数として与えられるためです。コード属性にはいくつかのヘッダー情報があり、メソッドにはいくつかの開始コードと終了コードが必要であり、tableswitch ステートメントには最小/最大値と最大 3 バイトのパディングを含むいくつかのバイトが必要なため、このサイズはさらに小さくなります。
すべてのバイトコードに対応するための JVM のサイズを除いて、制限はありません。
16377 . 少なくとも次のような単純なコードの場合:
public class SwitchLimit {
public static void main(String[] args) {
int x = 0;
switch(x) {
case 0:
...
case 16376:
default:
}
System.out.println("done.");
}
}
この例では 16377 個の case ステートメントを使用できます ( は数えませんdefault
)。 を追加するcase 16377:
と、コードは次のエラーでコンパイルされません。
メソッド main(String[]) のコードが 65535 バイトの制限を超えています
他の人が指摘したように、メソッドが実際に意味のあることを行う場合、この数値はおそらく大幅に低くなります。
それはあなたの要件に依存します。範囲 int 型の多くのケースを持つことができます。int 型の範囲は有限であるため、その後、整数サイクルの概念が登場します。
int のサイズは -2,147,483,648 から 2,147,483,647 の範囲であるため、それらの数ごとにケースを指定できます。そのため、整数の場合は限られた数のケースがあります。
しかし、ケースで文字列を使用したい場合は、ボヘミアンが言ったように無制限の数のケースを持つことができます。
ケースの総数は、ハードウェアに応じて int が取り得る最大数になります。Javaのデータ型を見てください
したがって、ケースブロックの可能な数として範囲全体が得られます。
switch 内の case ステートメントの制限はありません。最悪の場合、ヒープ スペースを取得できますが、簡単な方法ではありません。
質問、回答、コメントを読んでも、なぜ関連性があるのか わかりません。case
手動で書くよりも多くの s を持つことができます。また、コードを機械生成するというありそうもないケースではswitch
、Java の es よりも優れた選択肢があります。
Infinite!!
そのような制限はありません。