在 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.length
、str.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
是直接的,与访问局部变量没有什么不同
我在大学学习了大约 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.length
、str.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
是直接的,与访问局部变量没有什么不同