在 for 循环中将大小设置为 n

setting size as n in for loop

我在大学学习了大约 4 个月的 C 语言编程课程。

在 C 中,它是一种 "rule",总是在 for 循环中设置一个等于 n 的大小(长度)。我将在下面的示例中展示。

for(int i = 0, n = strlen(x); i < n; i++) {

然而,在 java 中,我从未见过有人设置 arraylist/character sequence/etc 的 length/size。等于 n 并且 THEN 满足条件。 如果我们一直不做这样的事情,我们总是会少得 1 分或类似的分数。这样更好,因为计算机不必一遍又一遍地搜索长度(每次迭代)。

为什么人们不在 java 中使用它?这是有原因的吗?做这件事还不够吗?

编辑: 我发现用 C 语言做这件事的人并不多。无论如何,我是这样学的,而且我一直在用 Java也是。

在 Java 中,您通常会引用一些预先计算的字段,例如 arr.lengthstr.length()list.size()。将它们存储在变量中的好处微不足道,如果有帮助,JIT 编译器可能会自动执行此操作。但是,如果您能证明 some particular case 有显着改善,请务必继续。

这是一个代码优化的例子。高级语言的编译器会自动添加这种优化和其他类似的优化。我对 C 编译还不够熟悉,无法说明他们是否通常会自动添加此优化。我建议研究您使用的特定编译器,看看是否属于这种情况。

如果您的教授指出为什么这种方法对他如此重要,那将是一种善意。我可以告诉你,它不是 Java 等语言的惯用语,并且会降低你的代码的可读性,所以我建议不要采用这种做法,除非你能证明它有明显的好处。他可能试图训练你在默认情况下这样做,因为一些低级语言不会自动处理这个,如果你说需要从 API 或数据库中获取计数,那么获取计数可能会很昂贵出于某种原因。

编辑:评论中的指南针提出了一个很好的观点。如果您习惯于修改循环体内的列表,那么如果您不提前分配循环终止符,您将会有一段糟糕的时光。不过,在依赖于该列表的循环中修改列表的大小通常不是一个好主意。

数组的长度 属性 保存为 public final field,如 10.7 Array Member

中所述

The public final field length, which contains the number of components of the array. length may be positive or zero.

对对象字段的正常访问是通过 getfield 指令,但要获取数组长度,Java 为其提供特殊指令 arraylength

All arrays have associated lengths, which are accessed via the arraylength instruction.

所以访问 array.length 是直接的,与访问局部变量没有什么不同