2
case k_A:
  jstring a  = "....";
  break;
case k_B:
  jstring b = "....";
  break;
case k_C:
  jstring c = ".....";
  break;
case k_D:
  jstring d = ".....";
  break;
default:
  jstring dflt = ".....";

私の場合、実際には 200 の case ステートメントがあります。一度に 1 つの case ステートメントしか機能しませんが、switch ブロック内の 201 個のステートメントすべてにメモリが割り当てられていますか? はいの場合、この方法は推奨されますか?

4

2 に答える 2

2

文字列リテラルはすべて静的に存在します。彼らはどこから魔法のように現れると思いますか? この場合は C なので、それらはすべてデータ セグメントに存在します。

ケースの値が隣接している場合は、switch ステートメントの代わりにルックアップ配列を使用する必要があります。

ただし、コードには他の問題があります。C リテラルは jstring ではありません。NewStringUTF() を呼び出す必要があります。

于 2012-06-09T21:07:19.787 に答える
0

JVM の起動ごと、すべての文字列リテラルにメモリが割り当てられます。

その理由は、文字列インターニングによるものです。文字列リテラルは、特殊な定数として効果的にバイトコードにコンパイルされ、クラスが読み込まれると、それらすべてにメモリが割り当てられます。

コードはメソッドの呼び出しごとにメモリを割り当てているように見えますが、そうではありません。JVM はこれらの String オブジェクトをリサイクルしますが、String はimmutableであるため安全です。

それが、このコードが機能する理由です。

String a = "foo";
String b = "foo";
boolean same = (a == b); // true - they are the SAME object!

メモリ使用量について心配する必要はありません。コードはそのままにしておいてください。

于 2012-06-08T13:22:22.200 に答える