Java 迭代引用对象列表

Java 迭代引用对象列表,java,performance,optimization,well-formed,Java,Performance,Optimization,Well Formed,有人能建议我选择哪个选项吗?为什么 List<MyObject> list = new ArrayList<MyObject>(); // insert some objects for it 1). for(int i = 0 ; i < list.size() ; i ++ ) { System.out.println(list.get(i).getAttribute1()); System.out.println(list.ge

有人能建议我选择哪个选项吗?为什么

List<MyObject> list =  new ArrayList<MyObject>();
// insert some objects for it

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

2). for(int i = 0 ; i < list.size() ; i ++ ) {
        MyObject obj = list.get(i);
        System.out.println(obj.getAttribute1());
        System.out.println(obj.getAttribute2());
    }
List List=new ArrayList();
//为它插入一些对象
1). 对于(int i=0;i

是的,我知道。。。他们将产生相同的结果,但我想知道哪个选项更有效,格式好,使用广泛,为什么?我只注意到第一个选项之间的写入时间比另一个选项长。有什么建议吗?

选项:1Get在列表中使用了两次,这是一个附加过程

选项:2只使用一个get,这会减少过程。因此,这比选项1更好

在这两个选项中,将为for循环的每次迭代计算list.size()。为了避免这种情况,您可以在迭代开始之前计算长度,如下所示:

for (int i = 0, length = list.size(); i < length; i ++) {
   // your code here

}

第二个选项可能稍微好一点(只有一个“get(i)”),但通常编译器足够聪明,可以优化两个版本,以使其更适合equal@DmitryBychenko我假设第一个选项总是在列表对象中查找。我说的对吗?@DmitryBychenko编译器如何优化这两个版本以使其相等?如果关闭优化,第一个选项将稍差一些:它调用list.get(I)两次,因此系统应该检查边界、计算移位等。两次。当启用优化时,编译器可能会消除边界检查和预计算list.get(i)(如第一个选项中所示)。是的,我知道每个循环的。但我并没有找到更有效的方法。我只是比较这两种选择。在某些情况下,我们不能为每个循环使用,我得到了选择哪个选项的模糊性。谢谢你的回答。@Cataclysm如果我的列表太大,那么我将使用选项2ok编码!如果是这样,我将永远选择选项2。我想我的问题很好。谢谢。顺便说一句,我的名单也太大了,我想知道哪个选项更可靠。所以,我问了这个问题。
for (MyObject obj: list) {
  System.out.println(obj.getAttribute1);
}