java中list的size()方法的实现
我有两段代码,第一部分在这里java中list的size()方法的实现,java,Java,我有两段代码,第一部分在这里 int count = myArrayList.size(); for (int a =0; a< count; a++) { //any calculation } 代码的第二部分是 for (int a =0; a< myArrayList.size(); a++) { //any calculation } ArrayList<Integer> myArrayList = new ArrayList<>
int count = myArrayList.size();
for (int a =0; a< count; a++) {
//any calculation
}
代码的第二部分是
for (int a =0; a< myArrayList.size(); a++) {
//any calculation
}
ArrayList<Integer> myArrayList = new ArrayList<>();
for (int a =0; a<1000; a++) {
myArrayList.add(a);
}
long startTime = System.nanoTime();
for (int a =0; a< myArrayList.size(); a++) {
//any calculation
}
long lastTime = System.nanoTime();
long result = lastTime - startTime;
在这两部分中,我都在迭代myArrayList,这是ArrayList大小,但在第一部分中,我计算大小,然后迭代,这意味着方法大小只被调用一次,但在另一方面,在第二部分中,每当它迭代时,它首先计算大小,然后检查大小是否小于。这不是一个很长的过程吗?我在许多地方的许多例子都计算了每次迭代的大小
我的问题是:
这不是一个漫长的过程吗?谈第二部分
什么是第一个或第二个最佳实践?
哪一种是执行迭代的有效方法?
myArrayList.size此大小方法如何工作或计算大小?
版本:
为了测试同样的东西,我编写了程序并计算了代码运行的时间
for (int a =0; a< myArrayList.size(); a++) {
//any calculation
}
ArrayList<Integer> myArrayList = new ArrayList<>();
for (int a =0; a<1000; a++) {
myArrayList.add(a);
}
long startTime = System.nanoTime();
for (int a =0; a< myArrayList.size(); a++) {
//any calculation
}
long lastTime = System.nanoTime();
long result = lastTime - startTime;
结果是=34490纳秒
另一方面
ArrayList<Integer> myArrayList = new ArrayList<>();
for (int a =0; a<1000; a++) {
myArrayList.add(a);
}
long startTIme = System.nanoTime();
int count = myArrayList.size();
for (int a =0; a< count; a++) {
}
long endTime = System.nanoTime();
long result = endTime - startTIme;
结果是=11394纳秒
当在每次迭代中调用size方法需要花费很多时间时,而不是每次调用都调用它。这是检查时间计算的正确方法吗
不会。调用不是一个长时间运行的过程,JVM可以快速进行函数调用。
两者都可以接受。更喜欢容易阅读的。添加具有有意义名称的本地引用可以使某些内容更易于阅读。
您可能更喜欢,但为了可读性1。在你们的选择中,并没有明显的效率差异,也并没有针对每一种选择的效率差异。
ArrayList实现在OpenJDK实现和其他实现中保持一个内部计数,即管理支持列表的内部数组。
1另请参见我确信JVM可以缓存该值,而不是为循环的每次迭代进行计算。还可以看看java代码中的size方法。1这不是一个很长的过程吗?不是很多;2最佳实践是第一种还是第二种然而,无论你试图做什么,两者都不是,或者两者都应该考虑使用增强的循环或迭代器;3哪种是执行迭代的有效方法?-使用迭代器或增强循环;4myArrayList.size-维护一个变量,该变量表示其备份缓冲区中包含的元素数,因此,不是much@ScaryWombat呵呵,是的,但是你可以从ArrayList中删除和添加元素,这会影响终止条件,所以每次迭代都必须调用它;在文档中,它返回元素的数量,所以我有一个问题,它如何在内部实现?它会计算一个并缓存它吗?我不确定itArrayList是否会保留一个具有自己长度的私有变量。当您添加或缩短列表时,它会得到更新。Re:2除非您需要循环中的计数或迭代索引,否则最好使用for each循环。