談談Java基礎資料型別

超人汪小建發表於2019-02-27

Java的基本資料型別

型別 意義 取值
boolean 布林值 true或false
byte 8位有符號整型 -128~127
short 16位有符號整型 -pow(2,15)~pow(2,15)-1
int 32位有符號整型 -pow(2,31)~pow(2,31)-1
long 64位有符號整型 -pow(2,63)~pow(2,63)-1
float 32位浮點數 IEEE754標準單精度浮點數
double 64位浮點數 IEEE754標準雙精度浮點數
char 字元型 16位不帶符號,Unicode字元

JVM本地對應的型別

typedef unsigned char   jboolean;
typedef signed char jbyte;
typedef short           jshort;
typedef int jint;
typedef long long jlong;
或
typedef __int64 jlong;
typedef double          jdouble;
typedef float           jfloat;
typedef unsigned short  jchar;複製程式碼

java的boolean在jvm中對應unsigned char型別(0為false而非0為true);byte對應signed char型別;short對應short型別;int對應int型別;long對應long long或者_int64型別;double對應double型別;float對應float型別;char對應unsigned short型別。

編譯器生成bytecode的型別

compiler將java編譯為class,而class檔案除了結構資訊和後設資料等,還包含了bytecode,這其實就是虛擬機器的指令,好比物理機的機器指令。舉個例子,

  public int getInt(){
    int a = 100;
    return a;
  }複製程式碼

生成該方法的bytecode為

bipush 100
istore_1
iload_1
ireturn複製程式碼

bipush 100將100以byte型推進operand stack中,istore_1將operand stack頂int型數值存入第二個區域性變數,iload_1將第二個int型區域性變數推進operand stack,ireturn返回int。

對於一些toy jvm會簡單地直接用C/C++處理指令,但對於工業級的openjdk中的Hotspot則會繼續生成彙編指令執行。

從上面的情況可以看到java的int型編譯成bytecode後可能會變成byte型來表示,這個主要取決於java的int型數值的大小,編譯器會在編譯期間判斷大小從而生成對應的指令,比如小於128時則為bipush,大於138且小於32768時則為sipush,它表示以short型表示,而大於32768的則都是用ldc+常量池來表示。

執行時的型別

在指令執行時JVM並不需要指明型別,因為指令已經包含了型別資訊,但由於bytecode指令只用1個位元組來表示,所以指令數量需要控制,並不是每種基礎資料型別都有對應的操作指令,比如iload lload fload dload對應int long float and double。類似還有ireturn lreturn freturn dreturn

所以執行引擎只要根據不同的指令做不同的型別處理即可。

Java調本地

如果某個java物件呼叫了native方法,此本地方法由編譯器編譯後access flags 會生成ACC_NATIVE標識,執行引擎執行bytecode時,根據java-jvm型別的對映也可能會涉及到型別處理。

相關閱讀:
從JDK原始碼角度看併發鎖的優化
從JDK原始碼角度看執行緒的阻塞和喚醒
從JDK原始碼角度看併發競爭的超時
從JDK原始碼角度看Java併發的公平性
從JDK原始碼角度看java併發執行緒的中斷

====廣告時間,可直接跳過====

鄙人的新書《Tomcat核心設計剖析》已經在京東預售了,有需要的朋友可以到 item.jd.com/12185360.ht… 進行預定。感謝各位朋友。

=========================

歡迎關注:

談談Java基礎資料型別
這裡寫圖片描述

相關文章