1. 程式人生 > >java基礎 int變數自增 效率問題

java基礎 int變數自增 效率問題

本文論述java中以下三條語句的效率問題。
1. i++;
2. i = i+1;
3. i += 1;

所採用的的方法是隻寫出包含這三條語句的方法,編譯成位元組碼,然後分析位元組碼指令。
下面是我的java原始碼:

public class Some {
    public void add1(int a){
        a++;
    }
    public void add2(int a){
        a = a + 1;
    }
    public void add3(int a){
        a += 1;
    }
}

使用javac指令編譯過後(javac Some.java),會生成Some.class檔案。
然後使用指令 javap -verbose Some,顯示編譯後的位元組碼指令。
如下:

public void add1(int);
descriptor: (I)V
flags: ACC_PUBLIC
Code:
  stack=0, locals=2, args_size=2
     0: iinc          1, 1
     3: return
  LineNumberTable:
    line 3: 0
    line 4: 3

  public void add2(int);
descriptor: (I)V
flags: ACC_PUBLIC
Code:
  stack=2, locals=2, args_size=2
     0: iload_1
     1: iconst_1
     2: iadd
     3: istore_1
     4: return
  LineNumberTable:
    line 6: 0
    line 7: 4

  public void add3(int);
descriptor: (I)V
flags: ACC_PUBLIC
Code:
  stack=0, locals=2, args_size=2
     0: iinc          1, 1
     3: return
  LineNumberTable:
    line 9: 0
    line 10: 3

可以看到,add2方法中的i = i+1;通過編譯形成了4條位元組碼指令:
0: iload_1
1: iconst_1
2: iadd
3: istore_1
並且運算元棧深度為2,stack=2, locals=2, args_size=2

add1方法中的i++; add3中的i += 1;通過編譯形成了1條位元組碼指令:
0: iinc 1, 1
並且運算元棧為0, stack=0, locals=2, args_size=2

總結:
i++;和i += 1;形成的指令數較少,且不需要運算元棧。相對而言,i = i+1;需要至少2個運算元棧深度,並且形成的指令數較多。故,i++;和i+= 1;的效率一樣,並且二者的效率都優於i = i+1;

相關推薦

java基礎 int變數 效率問題

本文論述java中以下三條語句的效率問題。 1. i++; 2. i = i+1; 3. i += 1; 所採用的的方法是隻寫出包含這三條語句的方法,編譯成位元組碼,然後分析位元組碼指令。 下面是我的java原始碼: public

java基礎39 MyEclipse帶的常用快捷鍵和自己定義快捷鍵的方法步驟

inf www. shift -s htm html spa ctrl+左鍵 targe 1、MyEclipse自帶且常用的快捷鍵 內容提示(補全): Alt+/ 導包快捷鍵: Ctrl+Shift+o 格式化代碼: Ctrl+Shift+f 行代

shell 變數

[[email protected] onecloud]$ cat test_push.sh #!/bin/bash#to test the connectity to gateway.push.apple.com 2195#test 10 time if > 5 ,critical;if &

Java基礎語法 - 變數的定義和使用

變數定義 1 public class Main { 2 3 public static void main(String[] args) { 4 5 // 定義byte型別的變數 6 byte b = 10; 7 System

Java基礎語法 - 變數轉換

在java中變數轉發分為兩種,隱式轉換和強制轉換   隱式轉換:   1 byte a = 10; 2 int b = 20; 3 4 byte c = a + b; // 該方法會報錯,轉換過程中位元組數只能從小變大,不能從大變小 5 int d = a + b; // 改方法則正常

[Bash]整型變數(加1)的幾種方法

#note that any space is not allowed before nor after = #you can use or not use $ before a variable inside $(()) and $[] a=1 a=$((a+1)) a=$((a + 1)

Java基礎------成員變數和區域性變數的區別和形參問題

在類中的位置不同 (1)成員變數:類中方法外。 (2)區域性變數:方法內部或者方法宣告上。 在記憶體中的位置不同 (1)成員變數:堆記憶體。 (2)區域性變數:棧記憶體。 生命週期不同 (1)成員變數:隨著物件的存在而存在,隨著物件的消失而消失。 (2)區域性變數:隨

Java基礎變數,運算子)

1.基本資料型別:   一、分析基本資料型別的特點,最大值和最小值。 1、 基本型別:int 二進位制位數:32 包裝類:java.lang.Integer 最小值:Integer.MIN_VALUE= -2147483648 (-2的31次方) 最大值:Integer.MAX

Java基礎——靜態變數、成員變數、區域性變數

1. 變數的型別 在java語言中,變數的型別有3中:成員變數、靜態變數、區域性變數 (1)成員變數 當類被例項化時,成員變數就會在記憶體中分配空間被初始化,直到這個例項化物件的生命週期結束時,成員變數的生命週期才結束。所以,類的成員變數的作用範圍與類的例項化物件的作用範圍相同。 (

Java基礎語法 變數和常量

一、變數 1、變數的格式:型別 變數名=初始值 例:int num1=10; 2、靜態方法只能定義靜態變數 3、變數的初始值: A)區域性變數不會自動賦值 B)成員變數會賦初始值。整型變數:0,浮點型別:0.0,字元型:’/u000’,布林 型:false,引用資料型別:null 常見面

java基礎-靜態變數和靜態常量以及靜態方法的理解

靜態變數是用static修飾符修飾的變數,靜態常量是static  final修飾的變數; 宣告和訪問許可權: 靜態變數:必須是成員變數,static不能修飾區域性變數。靜態成員變數可以通過類名訪問,也可以通過物件名進行訪問。 靜態方法:用static修飾

JAVA基礎作業練習—定義異常之模擬ATM

package homework; import java.util.InputMismatchException; import java.util.Scanner; class Atm { private double banlance; double num; private String I

java基礎(一)——變數有效範圍

1、成員變數:在類體中所定義的變數稱為成員變數,成員變數在整個類中都有效。類的成員變數又可以分為靜態變數和例項變數。      如果在成員變數的型別前加上關鍵字static,這樣的成員變數稱為靜態變數,靜態變數的有效範圍可以跨類,甚至可達整個應用程式之內。 2、區域性變數:

shell指令碼中整數型變數(加1)的實現方式

在shell指令碼中,有時為了計數,需要編寫整數型變數,並用自增來顯示。 shell指令碼中的整數型變數,自增有多種實現方式,整體測試指令碼如下: #!/bin/sh #本指令碼測試shell指令碼中整型變數自增 加1的幾種方法 #定義整型變數 a=1 echo $a

Bash Shell中變數的實現方法

Linux Shell中寫迴圈時,常常要用到變數的自增,現在總結一下整型變數自增的方法。 我所知道的,bash中,目前有五種方法: 1. i=`expr $i + 1`; 2. let i+=1; 3. ((i++)); 4. i=$[$i+1]; 5. i=$(( $i

shell 整型變數(加1)的幾種方法

#!/bin/sh a=1 a=$(($a+1)) a=$[$a+1] a=`expr $a + 1` let a++ let a+=1 ((a++)) echo $a 輸出 : 6 轉載自:http://blog.csdn.net/junchaox/arti

Java和C++中的區別

Java和C++對i++自增操作符的處理是不同的,JAVA是在記憶體中複製一份i值的拷貝再運算,而C++中是直接在原值上運算。 int i = 0; i = i++; 在java中i=i++的運算實質是先執行在記憶體中複製一份i的拷貝再i++

C語言For迴圈的執行過程以及變數減過程。

程式一: #include<stdio.h> main(){ int i; int num=0; for(i=0;i<5;i++){ num++; printf("num=%

[unix]兩個互斥量保護共享變數,保證執行緒執行安全例項

#include "apue.h" #include <pthread.h> #define NHASH 29 #define HASH(id) (((unsigned long)id)%NHASH) struct foo *fh[NHASH];

java基礎變數和方法的訪問許可權

public protected private 什麼訪問許可權修飾符也沒加稱為友好變數/方法。(有些情況下未加是有預設的) 適用物件和範圍:類 類中的成員方法和成員變數 介面 。不可在區域性變數前加訪問許可權修飾符。 public 的方法和欄位可以被