先说明一下它们的区别:
1.i=i+10执行的效率比i+=10低
2.i=i+10执行完成后的数据类型为int和a的类型的最高者;i+=10执行后的数据类型为i的数据类型。
接下来使用两个个简单的小例子来说明它们之间的执行效率的区别:
第一个例子:
public class Test{
public static void main(String[] args){
int i=0;
i=i+10;
}
}
javap -c 后的文件
Compiled from "Test.java"
public class Test {
public Test();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: iconst_0 //把0放入栈
1: istore_1 //把栈中的0存入局部变量表
2: iload_1 //把局部变量表中的0压入栈
3: bipush 10 //把10压入栈
5: iadd //把栈中的两个数相加
6: istore_1 //存放到局部变量表
7: return
}
第二个例子:
public class Test1{
public static void main(String[] args){
int i=0;
i+=10;
}
}
javap -c 后的文件:
Compiled from "Test1.java"
public class Test1 {
public Test1();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: iconst_0 //把0压入栈
1: istore_1 //把栈中的0存入局部变量表
2: iinc 1, 10 //把局部变量表中的1再加上10
5: return
}
通过上面两个小例子很明显的可以看到它们的区别了;
(i+=10)确实比(i=i+10)效率高点,因为其可以直接在局部变量表中完成操作。
接下来这两个例子用来说明它们执行后的数据类型:
第一个例子:
public class Test{
public static void main(String[] args){
char i=0;
i=i+10;//这里的i已经是int类型
char j=0;
j=i;//必须使用强制类型转换
}
}
这个class文件是不能通过编译的,必须使用强制类型转换才行。
第二个例子:
public class Test1{
public static void main(String[] args){
char i=0;
i+=10;//执行完成后依然为char类型
char j=0;
j=i;//不需要强制类型转换
}
}
这个class直接可以通过编译,不需要使用强制类型转换