比如:
UserVo userVo = null;
while(iterator.hasNext()){
userVo = it.next();
...
}
与这种
while(iterator.hasNext()){
UserVo userVo = it.next();
...
}
除了作用域,在内存中会有什么区别
我想知道第二种方式会不会重新分配引用,造成栈空间浪费
这两种方式在效率上是否有差别
UserVo userVo = null;
while(iterator.hasNext()){
userVo = it.next();
...
}
与这种
while(iterator.hasNext()){
UserVo userVo = it.next();
...
}
除了作用域,在内存中会有什么区别
我想知道第二种方式会不会重新分配引用,造成栈空间浪费
这两种方式在效率上是否有差别
iterator和it是一回事...
大家看懂大意就好
而第二种每次都 UserVo userVo = it.next(); 每次都申请内存空间
测试,test1,test2两个方法: import java.util.ArrayList;
import java.util.Iterator;public class Main{
public static void main(String[] args) {
}
public void test1(ArrayList<String> list){
String str ;
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()){
str = iterator.next();
}
}
public void test2(ArrayList<String> list){
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()){
String str = iterator.next();
}
}
}反编译: public void test1(java.util.ArrayList);
Code:
Stack=1, Locals=4, Args_size=2
0: aload_1
1: invokevirtual #2; //Method java/util/ArrayList.iterator:()Ljava/util/Iterator;
4: astore_3
5: aload_3
6: invokeinterface #3, 1; //InterfaceMethod java/util/Iterator.hasNext:()Z
11: ifeq 27
14: aload_3
15: invokeinterface #4, 1; //InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
20: checkcast #5; //class java/lang/String
23: astore_2
24: goto 5
27: return
LineNumberTable:
line 10: 0
line 11: 5
line 12: 14
line 14: 27
Signature: length = 0x2
00 11 public void test2(java.util.ArrayList);
Code:
Stack=1, Locals=4, Args_size=2
0: aload_1
1: invokevirtual #2; //Method java/util/ArrayList.iterator:()Ljava/util/Iterator;
4: astore_2
5: aload_2
6: invokeinterface #3, 1; //InterfaceMethod java/util/Iterator.hasNext:()Z
11: ifeq 27
14: aload_2
15: invokeinterface #4, 1; //InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
20: checkcast #5; //class java/lang/String
23: astore_3
24: goto 5
27: return
LineNumberTable:
line 16: 0
line 17: 5
line 18: 14
line 19: 24
line 20: 27
Signature: length = 0x2
00 11
出了局部变量的编号不同,没看出什么差别.
再用jad对class文件进行反编译: // Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html
// Decompiler options: packimports(3)
// Source File Name: Main.javaimport java.util.ArrayList;
import java.util.Iterator;public class Main
{ public Main()
{
} public static void main(String args[])
{
} public void test1(ArrayList arraylist)
{
String s;
for(Iterator iterator = arraylist.iterator(); iterator.hasNext();)
s = (String)iterator.next(); } public void test2(ArrayList arraylist)
{
String s;
for(Iterator iterator = arraylist.iterator(); iterator.hasNext();)
s = (String)iterator.next(); }
}
可以看出两个方法一样了.最后,你可以让两种方式都跑上几万次,测试花费的时间.
public static void main(String [] args) {
long t1 = System.currentTimeMillis();
int a = 0;
for(int i = 0; i < 50000000; i++) {
a = 5;
}
long t2 = System.currentTimeMillis();
System.out.println(t2 - t1);
long t3 = System.currentTimeMillis();
for(int j = 0; j < 50000000; j++) {
int b = 5;
}
long t4 = System.currentTimeMillis();
System.out.println(t4 - t3);
}
}怎么输出结果是
235
109
反而下面的效率要高些。。
但我就是想知道这样优化的必要性
会不会有浪费看了zangXT的反编译有点费解,反编译后居然一样了
java编译是经过优化的,优化成一样了,是不是说明怎么写都一样,编译会统一到一样呢