谈谈Java基础数据类型
Java的基本數(shù)據(jù)類型
| boolean | 布爾值 | true或false |
| byte | 8位有符號(hào)整型 | -128~127 |
| short | 16位有符號(hào)整型 | -pow(2,15)~pow(2,15)-1 |
| int | 32位有符號(hào)整型 | -pow(2,31)~pow(2,31)-1 |
| long | 64位有符號(hào)整型 | -pow(2,63)~pow(2,63)-1 |
| float | 32位浮點(diǎn)數(shù) | IEEE754標(biāo)準(zhǔn)單精度浮點(diǎn)數(shù) |
| double | 64位浮點(diǎn)數(shù) | IEEE754標(biāo)準(zhǔn)雙精度浮點(diǎn)數(shù) |
| char | 字符型 | 16位不帶符號(hào),Unicode字符 |
JVM本地對(duì)應(yīng)的類型
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;復(fù)制代碼java的boolean在jvm中對(duì)應(yīng)unsigned char類型(0為false而非0為true);byte對(duì)應(yīng)signed char類型;short對(duì)應(yīng)short類型;int對(duì)應(yīng)int類型;long對(duì)應(yīng)long long或者_(dá)int64類型;double對(duì)應(yīng)double類型;float對(duì)應(yīng)float類型;char對(duì)應(yīng)unsigned short類型。
編譯器生成bytecode的類型
compiler將java編譯為class,而class文件除了結(jié)構(gòu)信息和元數(shù)據(jù)等,還包含了bytecode,這其實(shí)就是虛擬機(jī)的指令,好比物理機(jī)的機(jī)器指令。舉個(gè)例子,
public int getInt(){int a = 100;return a;}復(fù)制代碼生成該方法的bytecode為
bipush 100 istore_1 iload_1 ireturn復(fù)制代碼bipush 100將100以byte型推進(jìn)operand stack中,istore_1將operand stack頂int型數(shù)值存入第二個(gè)局部變量,iload_1將第二個(gè)int型局部變量推進(jìn)operand stack,ireturn返回int。
對(duì)于一些toy jvm會(huì)簡(jiǎn)單地直接用C/C++處理指令,但對(duì)于工業(yè)級(jí)的openjdk中的Hotspot則會(huì)繼續(xù)生成匯編指令執(zhí)行。
從上面的情況可以看到j(luò)ava的int型編譯成bytecode后可能會(huì)變成byte型來表示,這個(gè)主要取決于java的int型數(shù)值的大小,編譯器會(huì)在編譯期間判斷大小從而生成對(duì)應(yīng)的指令,比如小于128時(shí)則為bipush,大于138且小于32768時(shí)則為sipush,它表示以short型表示,而大于32768的則都是用ldc+常量池來表示。
執(zhí)行時(shí)的類型
在指令執(zhí)行時(shí)JVM并不需要指明類型,因?yàn)橹噶钜呀?jīng)包含了類型信息,但由于bytecode指令只用1個(gè)字節(jié)來表示,所以指令數(shù)量需要控制,并不是每種基礎(chǔ)數(shù)據(jù)類型都有對(duì)應(yīng)的操作指令,比如iload lload fload dload對(duì)應(yīng)int long float and double。類似還有ireturn lreturn freturn dreturn。
所以執(zhí)行引擎只要根據(jù)不同的指令做不同的類型處理即可。
Java調(diào)本地
如果某個(gè)java對(duì)象調(diào)用了native方法,此本地方法由編譯器編譯后access flags 會(huì)生成ACC_NATIVE標(biāo)識(shí),執(zhí)行引擎執(zhí)行bytecode時(shí),根據(jù)java-jvm類型的映射也可能會(huì)涉及到類型處理。
相關(guān)閱讀:
從JDK源碼角度看并發(fā)鎖的優(yōu)化
從JDK源碼角度看線程的阻塞和喚醒
從JDK源碼角度看并發(fā)競(jìng)爭(zhēng)的超時(shí)
從JDK源碼角度看Java并發(fā)的公平性
從JDK源碼角度看java并發(fā)線程的中斷
====廣告時(shí)間,可直接跳過====
鄙人的新書《Tomcat內(nèi)核設(shè)計(jì)剖析》已經(jīng)在京東預(yù)售了,有需要的朋友可以到 item.jd.com/12185360.ht… 進(jìn)行預(yù)定。感謝各位朋友。
=========================
歡迎關(guān)注:
這里寫圖片描述總結(jié)
以上是生活随笔為你收集整理的谈谈Java基础数据类型的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 线性代数的本质笔记-更新ing
- 下一篇: Java学习笔记12——JVM入门