通过反汇编class看i++和++i的区别

       public void method4() {
		int i = 1;
		int j = 2;
		
		int a = i++;
		int b = ++j;
	}






使用javap -c 解开class后


           0:   iconst_1    //从常量池取出1放入操作栈顶
	   1:   istore_1    //把操作栈顶元素保存到本地变量i中 i=1
	   2:   iconst_2    //从常量池取出2放入操作栈顶
	   3:   istore_2    //把操作栈顶元素保存到本地变量j中 j=2
	   4:   iload_1     //把本地变量i放入操作栈顶i=1
	   5:   iinc    1, 1    //执行把本地变量i+1 ,操作栈顶不变
	   8:   istore_3        //把操作栈顶元素保存到本地变量a中
	   9:   iinc    2, 1    //执行把本地变量j+1 ,操作栈顶不变
	   12:  iload_2         //把本来变量j放入栈顶 j=3
	   13:  istore  4       //把栈顶j保存到本地变量,即b=3
	   15:  return
 


预备知识:
iconst 把int型数据放到操作栈顶
istore 把栈顶int元素保存到本地变量,移除栈顶元素
iload int本地变量放入栈顶
iinc 把int元素自动+1        如iinc 1,1  第一位是本地变量index,第二位是+的数值
iinc 不会改变栈顶元素的值,它只会改变本地变量的值

不知大家从上面的jvm 指令可以他们之前的不同没?
后++ 的顺序是load ----iinc---store
先++ 的顺序是iinc ----load---store
先前说过iinc不会改变栈顶,会直接修改本地变量的值,所有后++会把先前load的值原封不动的保存进去
而后++会先改变本地变量值,然后把本地变量捞出来,再保存

所以如果++i 和i++ 如果用于自增这两个是没有区别的,都相当于i=i+1,但如果是通过这个来赋值
如 int a = i++;   int b = ++j; 那么a保存i原有值,b= j+1


注意
int i = 1; System.out.println(i++);

int i = 1;i++; System.out.println(i);
的区别,原理和上面一样

你可能感兴趣的:(Class)