[解決済み] Stringでswitch文が使えないのはなぜですか?
質問
この機能は、後のJavaバージョンに搭載されるのでしょうか?
なぜこれができないのか、誰か技術的な方法で説明してくれませんか、Javaの
switch
文は機能するのでしょうか?
どのように解決するのですか?
でのSwitchステートメント
String
のケースが実装されました。
Java SE 7
は、少なくとも16年
は、最初にリクエストされてから
明確な理由は明らかにされていないが、おそらく性能に関係するものだろう。
JDK 7での実装
この機能は、現在
javac
を、quot;de-sugar"処理で追加しました。
を使用したクリーンでハイレベルなシンタックスです。
String
の定数
case
の宣言は、コンパイル時にパターンに従ってより複雑なコードに展開されます。その結果、常に存在するJVM命令が使われる。
A
switch
と
String
のケースは、コンパイル時に2つのスイッチに変換される。最初のスイッチは、各文字列を一意の整数(元のスイッチの位置)に対応付ける。これは、まずラベルのハッシュコードをスイッチすることで行われる。対応するケースは
if
文は、文字列の等質性をテストします。ハッシュ上で衝突があった場合、テストはカスケード接続された
if-else-if
. 2番目のスイッチは、元のソースコードと同じですが、大文字と小文字のラベルを対応する位置に置き換えています。この2段階の処理により、元のスイッチのフロー制御を維持することが容易になります。
JVMのスイッチ
に関する技術的な深堀りは
switch
は、JVM仕様書を参照することができます。
switch文のコンパイル
が記述されています。一言で言えば、スイッチに使えるJVM命令は、ケースによって使われる定数の疎密によって、2種類あります。どちらも、効率的に実行するために、各ケースで整数定数を使用することに依存します。
定数が密な場合、その定数は(最小値を引いた後の)インデックスとして、命令ポインタのテーブルである
tableswitch
命令です。
定数がまばらな場合、正しいケースを探すためにバイナリサーチが実行されます。
lookupswitch
という命令があります。
をデスガする際に
switch
オン
String
オブジェクトの場合、両方の命令が使用される可能性があります。そのため
lookupswitch
は、ハッシュコードの最初のスイッチで、ケースの元の位置を求めるのに適している。その結果得られる序列は、自然に
tableswitch
.
どちらの命令も、コンパイル時に各ケースに割り当てられた整数定数をソートしておく必要があります。実行時には
O(1)
の性能は
tableswitch
よりも一般的に良く見える。
O(log(n))
の性能は
lookupswitch
しかし、テーブルが十分な密度を持ち、時空間のトレードオフを正当化できるかどうかを判断するためには、いくつかの分析が必要です。Bill Vennersは次のように書いています。
素晴らしい記事
では、他のJavaフロー制御命令の裏側とともに、この点をより詳しく取り上げています。
JDK 7以前
JDK 7 より前のバージョン。
enum
を近似することができます。
String
-をベースにしたスイッチです。これは
静的な
valueOf
メソッドは、コンパイラがすべての
enum
型になります。例えば
Pill p = Pill.valueOf(str);
switch(p) {
case RED: pop(); break;
case BLUE: push(); break;
}
関連
-
コンストラクタの呼び出しは、コンストラクタのエラー理解の最初のステートメントである必要があります。
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] この2回(1927年)を引き算すると、なぜおかしな結果になるのでしょうか?
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] なぜパスワードにはStringではなくchar[]が好まれるのですか?
-
[解決済み] C#で文字列のエンコーディングを手動で指定せずに、一貫性のあるバイト表現を得るには?
-
[解決済み] Rubyのswitch文の書き方
-
[解決済み] switch文の中で変数を宣言してはいけないのはなぜですか?
-
[解決済み】JavaScriptで文字列の出現箇所をすべて置換する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Java エラー報告 スレッド "main" での例外 java.util.NoSuchElementException
-
スレッド "main "での例外をEclipseで解決 java.lang.Error: 未解決のコンパイル問題、コンパイラとパッケージの不整合
-
Java Exceptionが発生しました エラー解決
-
final, finally, finalizeの違いについて話してください。
-
javaで非静的な解を静的な参照にすることができない
-
Intellij IDEAのエラー「CreateProcess error=2, system could not find specified file」に対する完璧な解決策です。
-
スレッド "main" で例外発生 java.lang.ArrayIndexOutOfBoundsException: 4 at text.Division.main(Divisi
-
spring-boot 401 このリソースにアクセスするには完全な認証が必要です エラー解決
-
linux run jarfile Invalid or corrupt jarfile error.
-
IDEA パッケージステートメントの欠落