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 语句起作用,但内存是否分配给了 switch 块中的所有 201 语句?如果是,是否推荐这种方法?

4

2 回答 2

2

字符串文字都是静态存在的。你认为它们是从哪里神奇地出现的?在这种情况下,它是 C,因此它们都存在于您的数据段中。

如果您的案例值是相邻的,您可能应该使用查找数组而不是 switch 语句

但是,您的代码还有其他问题。C 文字不是 jstrings。您需要调用 NewStringUTF()。

于 2012-06-09T21:07:19.787 回答
0

每次 JVM 启动都会为所有字符串文字分配一次内存。

原因是由于String interning:字符串文字作为特殊常量被有效地编译到字节码中,并且在类加载时为所有它们分配内存,并且永远不会再分配内存。

尽管代码似乎会在每次调用该方法时分配内存,但实际上并非如此 - JVM 会回收这些 String 对象,这样做是安全的,因为 String 是不可变的。

这就是这段代码有效的原因:

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

不要担心内存使用 - 保持代码不变。

于 2012-06-08T13:22:22.200 回答