2012-06-14 13 views
16

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

+2

Java 7では、文字列による切り替えも可能です[ここをクリック](http://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html)。これにより、無制限の数のスイッチが可能になります。 – Santosh

+2

+1偉大な質問、うまくいけないダブ。 – dacwe

+2

確かに上限がありますが、20を超えない場合、なぜこの質問がありますか?あなたがPrimeを使うためのプログラムを書いていると教えてください。 –

答えて

4

要件によって異なります。あなたはrange int型の多くのケースを持つことができます。 int型の範囲が有限で、そのあと整数サイクルの概念が現れます。

intのサイズが-2,147,483,648から2,147,483,647までの範囲であるため、それぞれの数に応じて大文字と小文字を区別することができます。したがって、整数の場合は限られた数のケースがあります。

しかし、文字列を大文字で使用する場合は、ボヘミアン語のように大文字と小文字を無制限にすることができます。

7

は制限が

+2

JVM仕様!= java仕様です。 jvmがJava仕様にない制限を課す場合は、javacまたはjvm – aioobe

+0

Yep Bohemianのいずれかでバグレポートを提出できます。私もそう思った。しかし、それが書かれた場所を見つけることができませんでした。 – namalfernandolk

2

は、ケースの合計数はintはハードウェアに応じて取ることができる最大数になり、すべてのバイトコードに対応するために、あなたのJVMのサイズを除いて、ありません。ご覧くださいdatatypes in java

このように、可能な範囲内のケースブロックの数をすべて指定します。

-2

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

+3

完全に真実ではありません。上限があります。 – Blender

+0

上限はあなたが欲しいケースの数ですか? – namalfernandolk

+0

いいえ、上限はメソッドあたりの最大文字数65535で定義されます。それよりも長いメソッドは「コードが大きすぎてコンパイルできません」または「コードが大きすぎます」という文がコンパイルされませんでした。 – Nicktar

2

スイッチの大文字小文字の制限はありません。最悪の場合、ヒープスペースは得られますが、簡単な方法ではありません。

+0

間違っています。 Javaメソッドには、最大65535文字を含めることができます。 – Nicktar

+1

@Nicktar::Dあなたの研究や何かを共有してもらえますか?それは信じがたいです!個人的には私は1800行の方法とダムを見てきましたが、それ以上の文字が65535であることを確認しました。 http://stackoverflow.com/questions/6570343/maximum-size-of-a-method-in-java – manurajhada

+0

@manurajhada http: //bugs.sun.com/view_bug.do?bug_id=4262078 65535は生成されたバイトコードの最大サイズです(ソースコードではありません)。スイッチのケースごとに少なくとも1バイトの生成されたバイトコードが存在しなければならない。従って限界は65535未満の場合でなければならない。 – emory

13

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

参照:各ケースであるジャンプターゲットを有するのでJava Virtual Machine Specification

無視またはケースブロックでコードを再利用するスイッチの絶対上限でLimitations of the Java virtual machineThe Constant Poolはわずかに低い30^2以上の場合であります32ビット整数(符号tableswitchlookupswitchの命令を参照)を使用しているため、ケースごとに4バイトが必要で、各メソッドのバイトコードサイズは2^32バイトよりわずかに小さくなります。これは、バイトコードがcode attributeにラップされ、length of a attributeが符号なし32ビット整数として指定されているためです。 code属性にはいくつかのヘッダ情報があり、メソッドにはいくつかのエントリと終了コードが必要で、tableswitch文には最小値/最大値と最大3バイトのパディングを持つバイトが必要です。

+0

興味深い答え(リンクありがとう)。しかし、それはスイッチに適用されますか?定数プールは、「クラス、インタフェース、クラスインスタンス、または配列のレイアウト」に使用されます。 switchステートメントはジャンプテーブル(配列!)にコンパイルされる可能性があり、理論上の制限はスイッチ当たり2Gケースであり、定数プールは配列の数、すなわちswitchステートメントのみを制限します。もちろん、実際にはずっと早くメモリ不足になります。 –

+0

はい、大文字小文字の定数はバイトコードに直接配置され、定数プールには配置されませんが、各大文字小文字ブロックのコードにはいくつかの定数プールエントリが必要になる可能性があります。もちろん、一定のプールエントリの使用を最小限に抑えることができます。'5'を' 4 + 1'としてコンパイルするか、同じ引数で同じメソッドを呼び出すことで、定数プールの限られたサイズを回避することができるようになります。 – x4u

+0

しかし、その制限はJavaクラスにも当てはまります。 –

1

質問、回答、コメントを読んで、私はそれがなぜ関係するのか分かりません。あなたは手動で書くことよりも確かにcaseを持つことができます。また、コードを機械で生成することができない場合は、Javaのswitch esよりも良い選択肢があります。

+0

最後に、現実的な答え! – Taslim

4

。少なくともような単純なコードのために:

public class SwitchLimit { 

    public static void main(String[] args) { 
     int x = 0; 
     switch(x) { 
     case 0: 
     ... 
     case 16376: 
     default: 
     } 
     System.out.println("done."); 
    } 

} 

あなたは(defaultを数えていない)、この例では16377個のcase文を持つことができますし、case 16377:を追加する場合、コードは次のエラーでコンパイルされません。

The code of method main(String[]) is exceeding the 65535 bytes limit

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