JAVA使用for循环会重复调用list.size()吗?

原创
09/25 14:49
阅读数 1.5W

最近有朋友讨论说for循环里不要用list.size(),这样会导致每次都调用一次list.size()接口会耗性能,建议我们在外面使用一个变量来存储这个list.size()的值再放到循环里面,真的是这样吗?我做了个小测试,代码如下:

public class Test2 {
    public static void main(String[] args) {

        List list = new ArrayList<String>();

        list.add("1");
        list.add("2");

        for (int i = 0; i < list.size(); i++) {
            System.out.println(i);
        }
    }
}

这里将list.size()放在了for循环里,按朋友的说法,这里应该会调用多次。

接下来我查看了字节码发现,这里确实会调用多次list.size()方法,字节码如下:

具体字节码指令解析可查看:http://www.blogjava.net/DLevin/archive/2011/09/13/358497.html

接着查看了ArrayList调用size()方法的源码是直接返回一个int 型的 size变量的,而这个size变量是每次新增和删除都会改变这个size的值

结论:经过网友们热情的探讨与更正,for循环里会多次调用list.size(),list.size()方法会直接返回一个声明在类中的size全局变量,虽然这个size会直接保存在堆中,但每次发生函数调用确实会发生压栈出栈的性能开销。

展开阅读全文
打赏
5
3 收藏
分享
加载中
影响不大
09/28 11:17
回复
举报
其实不用试验,想一想就可以想到:如果在for循环体中,增加或删除list的成员,size()的值就变了。所以每次for循环都需要调研size()函数。
09/27 09:02
回复
举报
汽车过减速带时会对悬架造成伤害,我们遇到减速带要下车把车抬过去。
09/27 08:28
回复
举报
自己测一下性能比纠结用不用临时变量更实际吧。我个人认为性能是一样的。
09/26 23:55
回复
举报
for (int i=0, j=list.size(); i<j; i++) {}
09/26 23:04
回复
举报
用JAVA不要纠结于这些微乎其微的性能问题,追求性能就研究高性能语言。
09/26 07:48
回复
举报
T小豆芽博主
有道理
09/26 08:30
回复
举报
invokeinterface指令用于调用声明为接口的方法,性能相对来说会慢一些。
09/25 20:34
回复
举报
T小豆芽博主
谢谢提醒,还得多学习学习
09/25 21:11
回复
举报
发生函数调用时压栈和出栈部分的开销呢。
09/25 20:19
回复
举报
根本不用看字节码,在ArrayList的size函数下断点,在for循环里面会多次中断。
09/25 17:39
回复
举报
48 goto 代表有循环调用啊!
09/25 17:30
回复
举报
确实会调用多次,但不管调用多少次,size()直接返回int值,也就是不存在运算开销,和你用一个变量接收的效果是一样的
09/25 17:35
回复
举报
更多评论
打赏
16 评论
3 收藏
5
分享
返回顶部
顶部