【发布时间】:2013-09-14 13:08:11
【问题描述】:
在 for 循环中的数组到达最后一个索引后,我收到一个异常,指出索引超出范围。我想要的是让它回到第一个索引,直到z 等于ctr。我该怎么做?
我的代码:
char res;
int ctr = 10
char[] flames = {'F','L','A','M','E','S'};
for(int z = 0; z < ctr-1; z++){
res = (flames[z]);
jLabel1.setText(String.valueOf(res));
}
【问题讨论】:
-
在访问
flames[]时使用%就像...flames[z%flames.length()]; -
在索引表达式上使用 mod (%) 运算符:
res = flames[z % flames.length()];或者更好的是,在 for 循环之外有一个 invariant 变量n = flames.length(),并且然后有res = flames[z % n]; -
@luis.espinal :编译器不会为我们做这件事吗?循环中的
flames.length()会被编译器优化,不是吗? -
@boxed__l - 好问题。我不相信它会做 IIRC。确认这一点的一种方法是在两个版本上使用 javap 反汇编程序(有和没有循环外的不变量)并比较两者的输出。
-
@luis.espinal :看来你是对的。在类似的代码上进行了反汇编。没有优化。有像ProGuard 这样的项目可以进行这种优化等等。 +1