java在for循环中将大小设置为n
我在大学学习编程C课程大约4个月了
在C语言中,在for循环中总是设置一个等于n的大小(长度)是一种“规则”。我将在下面的示例中显示
for(int i = 0, n = strlen(x); i < n; i++) {
然而,在java中,我从未见过有人将arraylist/character sequence/etc的长度/大小设置为n,然后设置该条件。 如果我们一直不这样做,我们总是会少拿1分或者类似的东西。这样更好,因为计算机不必反复搜索长度(每次迭代)
为什么人们不在java中使用它?这有什么原因吗?做这件事还不够重要吗
编辑:我发现C.中没有多少人这样做。。无论如何,我是这样学的,而且我也一直在用Java做这件事
# 1 楼答案
这是一个代码优化的示例。高级语言的编译器将自动添加此优化和其他类似优化。我对C编译还不太熟悉,不能说他们是否会自动添加这种优化。我建议您研究一下您使用的特定编译器,看看是否是这种情况
如果你的教授注意到为什么这种方法对他如此重要,那将是一种仁慈。我可以告诉您,它不是Java等语言的惯用语言,并且会降低代码的可读性,因此我建议您不要使用这种做法,除非您能够证明它有明显的好处。他可能是想训练你在默认情况下做到这一点,因为一些低级语言不会自动处理这个问题,如果你说出于某种原因需要从API或数据库获取计数,那么获取计数可能会很昂贵
编辑:评论中的指南针提出了一个很好的观点。如果您习惯于修改循环主体中的列表,那么如果您不提前指定循环终止符,那么您将度过一段不愉快的时光。不过,在依赖于列表的循环中修改列表的大小通常不是一个好主意
# 2 楼答案
在Java中,您通常引用一些预先计算的字段,如
arr.length
、str.length()
、list.size()
。将它们存储在变量中的好处是微不足道的,如果有帮助的话,JIT编译器可能会自动完成。但是如果你能证明在some particular case方面有显著的改进,那就千方百计去做吧# 3 楼答案
数组的length属性保存为
public final field
,如10.7 Array Member中所述对对象字段的正常访问是通过} :
getfield
指令进行的,但为了获得数组长度,Java为其提供了一条特殊指令^{所以对
array.length
的访问是直接的,与对局部变量的访问没有什么不同