16

Java の switch ステートメントにはいくつのケースが考えられますか? たとえば、整数をチェックしている場合、いくつのケースブロックが可能ですか?

4

8 に答える 8

15

最初に遭遇する可能性が最も高い限界は、クラスごとの定数プール内のエントリの最大数である 65535 の限界です。これにより、小さな複雑さの数千のケース ブロックが可能になります。定数プールには、クラスで少なくとも 1 回使用される数値または文字列リテラルごとに 1 つのエントリが含まれますが、すべてのフィールド、メソッド、および/またはクラス参照に対して 1 つ以上のエントリも含まれます。定数プールにも存在します。つまり、メソッド参照エントリは、メソッドのシグネチャの文字列エントリへの参照と、宣言するクラスのクラス エントリへの参照で構成されます。クラス エントリ自体も、クラス名の文字列エントリを参照します。

参照: Java 仮想マシンの制限およびJava 仮想マシン仕様定数プール

case ブロック内のコードを無視または再利用するスイッチの絶対上限は、2^30 ケースよりわずかに小さいです。これは、各ケースには符号付き 32 ビット整数 ( tableswitchおよびlookupswitch命令を参照) であるジャンプ ターゲットがあり、4 バイトが必要であるためです。各メソッドのバイト コード サイズは 2^32 バイト弱に制限されています。これは、バイト コードがコード属性にラップされ、属性の長さが符号なし 32 ビット整数として与えられるためです。コード属性にはいくつかのヘッダー情報があり、メソッドにはいくつかの開始コードと終了コードが必要であり、tableswitch ステートメントには最小/最大値と最大 3 バイトのパディングを含むいくつかのバイトが必要なため、このサイズはさらに小さくなります。

于 2012-06-14T07:39:34.730 に答える
7

すべてのバイトコードに対応するための JVM のサイズを除いて、制限はありません。

于 2012-06-14T05:53:21.497 に答える
5

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 バイトの制限を超えています

他の人が指摘したように、メソッドが実際に意味のあることを行う場合、この数値はおそらく大幅に低くなります。

于 2012-06-14T14:38:47.870 に答える
4

それはあなたの要件に依存します。範囲 int 型の多くのケースを持つことができます。int 型の範囲は有限であるため、その後、整数サイクルの概念が登場します。

int のサイズは -2,147,483,648 から 2,147,483,647 の範囲であるため、それらの数ごとにケースを指定できます。そのため、整数の場合は限られた数のケースがあります。

しかし、ケースで文字列を使用したい場合は、ボヘミアンが言ったように無制限の数のケースを持つことができます。

于 2012-06-14T05:49:53.357 に答える
2

ケースの総数は、ハードウェアに応じて int が取り得る最大数になります。Javaのデータ型を見てください

したがって、ケースブロックの可能な数として範囲全体が得られます。

于 2012-06-14T05:54:01.870 に答える
2

switch 内の case ステートメントの制限はありません。最悪の場合、ヒープ スペースを取得できますが、簡単な方法ではありません。

于 2012-06-14T05:55:20.147 に答える
1

質問、回答、コメントを読んでも、なぜ関連性があるのか​​ わかりません。case手動で書くよりも多くの s を持つことができます。また、コードを機械生成するというありそうもないケースではswitch、Java の es よりも優れた選択肢があります。

于 2012-06-14T13:27:51.453 に答える
-2

Infinite!!そのような制限はありません。

于 2012-06-14T05:54:04.383 に答える