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循环。