Java基礎資料型別 (Elementary Data Type)知識總結

來源:互聯網
上載者:User

標籤:java   基礎資料型別 (Elementary Data Type)   

Java基礎資料型別 (Elementary Data Type)一覽表
原生類型 佔位數 是否有符號位 最小值 最大值 預設值 封裝類 備忘
boolean 1 —— —— false Boolean boolean類型是孤獨的皇后,她無法和其他類型轉換
byte 8 -2^7=-128=Byte.MIN_VALUE 2^7-1=127=Byte.MAX_VALUE 0 Byte IO流中經常使用
char 16 ‘\u0000’=0=Character.MIN_VALUE ‘\uFFFF’=2^15*2-1=65535=Character.MAX_VALUE ‘\u0000’ Character
short 16 -2^15=Short.MIN_VALUE 2^15-1=Short.MAX_VALUE 0 Short 曆史遺留類型,不再被使用
int 32 -2^31=Integer.MIN_VALUE 2^31-1=Integer.MAX_VALUE 0 Integer
long 64 -2^63=Long.MIN_VALUE 2^63-1=Long.MAX_VALUE 0 Long 在int無法儲存的情況下使用
float 32 1.4E-45f=Float.MIN_VALUE 3.4028235E38=Float.MAX_VALUE 0.0f Float 在對記憶體要求高對精度要求不高時使用
double 64 4.9E-324=Double.MIN_VALUE 1.7976931348623157E308==Double.MAX_VALUE 0.0d Double
表說明:

1.nEm表示n*10的m次方,nE-m表示n*10的m次方分之一。
2.Java核心技術卷一是說:“Java沒有任何無符號類型”是錯的,事實上boolean和char確實是無符號類型。
3.Java核心技術卷一上標明了float類型的取值範圍是±3.40282347E38明顯寫錯了。

字元相關知識代碼單元就是char類型的數值範圍,0-65535都是代碼單元。代碼點就是超出65535的代碼單元,這時由於char類型的最大值限制,導致char無法表示一個大於65535的字元。

為解決這個問題,開發JavaAPI的攻城獅就將大於65535的字元統一用兩個代碼單元(0-65535)表示,並且規定,這兩個代碼單元是好基友,是一個整體,我們就叫它們代碼點好了!
為了將所有字元都有統一的名字,API的攻城獅也是蠻拼的,攻城獅們乾脆再規定,0-65535的代碼單元也可以叫代碼點!
以下為代碼單元和代碼點的作業碼:

char[] c = Character.toChars(65536);String str = new String(c);System.out.println("我是一個代碼點,不信你看: " + str.codePointCount(0, str.length()));// 1System.out.println("我是這個代碼點數值為:" + str.codePointAt(0));System.out.println("我是兩個代碼單元,不信你看: " + str.length());System.out.println("我是第一個代碼單元:" + (int) str.charAt(0));System.out.println("我是第一個代碼單元:" + (int) str.charAt(1));String test = "A" + str + "B";for (int i = 0; i < test.length(); i++) {    System.out.println("遍曆字串的代碼單元是這樣乾的:" + (int) test.charAt(i));}for (int i = 0; i < test.length(); i++) {    int codePoint = test.codePointAt(i);    System.out.println("遍曆字串的代碼點是這樣乾的:" + codePoint);    if (Character.isSupplementaryCodePoint(codePoint)) {        i++;    }}
為什麼不建議使用char?

String c1=””;//數學上的整數集符號,這個符號無法用char表示,因為它超出65535了,所以只能採用是兩個char(代碼單元)表示。
String str=c1+”A”;
char c2=str.chartAt(1);
結果c2不是你想要的’A’,而是的後半個字元(代碼單元)。

代碼單元代碼點相關的詳細資料請查看:
Java中的代碼點和代碼單元

Java如何儲存負數1.如何儲存負數

Java是採用”2的補碼”(簡稱補碼)儲存負數的。
如8位的數字00000001表示正數1,11111111示負數1。

2.補碼

補碼是基於有符號位的(基於置符號位的),正數的補碼等於數字本身(這句話要這樣理解:並不是正數的補碼等於本身,而是正數不需要計算它的補碼,正數計算的補碼是給負數用的,所以規定正數的補碼等於本身)。

3.”2的補碼”

“2的補碼”是將一個數的反碼+1。

4.反碼

反碼就是將數位二進位位全部取反,0變成1,1變成0,正數的反碼等於數字本身(這句話要這樣理解:並不是正數的反碼等於本身,而是正數不需要計算它的反碼,正數計算的反碼是給負數用的,所以規定正數的反碼等於本身)。
如00000001的反碼就是11111110。

5.”1的補碼”

“1的補碼”不用細究它,因為”1的補碼”的結果和反碼一致,只是它採用的不是”二進位位全部取反“的操作方式。我們不用管它是怎麼算的,直接將它理解成反碼就對了。

6.置符號位

數字置符號位是二進位中表示正負的方法,一個數位最高位就是符號位,如果符號位為0表示正,如果符號位為1表示負。

7.直觀標記法

直觀便於理解的表示二進位負數的形式是置符號位,不需要採用補碼。
如8位的數字00000001表示正數1,10000001示負數1。

8.為什麼採用補碼錶示負數

之所以採用補碼錶示負數,而不是直接採用直觀便於理解的置符號位,是因為在電腦中直觀表示在做負數運算是不能得到正確的結果,而補碼卻可以做到。
如:
數00000001(數字1的直觀標記法)
+10000001(數字-1的直觀標記法)
=10000010(數字-2的直觀標記法)
很明顯1+(-1)=0而不是-2啊!!!
而採用補碼方式卻可以得到正確的結果:
數00000001(數字1的補碼錶示法)
+11111111(數字-1的補碼錶示法)
注意此時只有8位,超過8位會溢出,所以:
=00000000(數字0的補碼錶示法)

基本類型轉換

1.boolean與其他任何類型都不相容。
2.小類型向大類型轉換時,如果小類型不是char類型,那麼就執行無符號擴充,如果小類型是char那麼永遠執行無符號擴充。
有符號擴充:
byte b=”00000001”;
short s=b;//此時s的值為0000000000000001
byte b=”11111111”;//11111111是byte類型-1的補碼形式
short s=b;//此時s的值為1111111111111111,1111111111111111是short類型-1的補碼形式。
無符號擴充:
char c=”1111111111111111”;
int i=c;//此時i的值為00000000000000001111111111111111。
char c=”0000000000000001”;
int i=c;//此時i的值為00000000000000000000000000000001。
3.大類型向小類型轉換時需要強制轉換。

浮點類型相關知識1.浮點類型的儲存範圍很大

float雖然和int佔位一樣,但float能儲存的值比int大太多,可以參見Integer.MAX_VALUE和Float.MAX_VALUE,不但如此,float比long都大很多,另外double又比float更大。 所以,long存放不了的數字可以存放在float,float放不下的數字可以放入double中。

2.浮點類型無法完全精確表示小數

float和double在計算時都不是完全精確的,float能精確到6位或7位小數,double能精確到15位小數。
超出範圍的小數會被四捨五入。
例如:

System.out.println(1.0f/0.3f);System.out.println(2.0f/0.3f);System.out.println(1.0d/0.3d);System.out.println(2.0d/0.3d);列印:3.33333336.66666653.33333333333333356.666666666666667
3.二進位無法精確表示一些可以在10進位精確表示的小數

二進位無法精確表示十進位中的一些數,就像十進位無法精確表示1/3一樣,二進位無法精確表示0.1等等各種小數。
(以下是複製的)
二進位表示小數的時候只能夠表示能夠用1/(2^n)的和的任意組合。
例如:
0.5能夠表示,因為它可以表示成為1/2。
0.75也能夠表示,因為它可以表示成為1/2+1/(2^2)。
0.875也能夠表示,因為它可以表示成為1/2+1/(2^2)+1/(2^3)。
0.1不能夠精確表示,因為它不能夠表示成為1/(2^n)的和的形式。

4.浮點類型在計算時容易出現偏差

原因有兩點:
1.因為浮點類型的精度都是固定的,超出範圍的精度會被四捨五入。
2.因為二進位無法精確表示十進位中的一些數,所以你會看到很奇怪的結果,如:

System.out.println(1.0-0.93);System.out.println(1.0-0.7);System.out.println(1.1-1.0);列印:0.06999999999999995//電腦無法表達0.070.30000000000000004//電腦無法表達0.30.10000000000000009//電腦無法表達0.1

要想使用完全精確的計算請使用BigDecimal,並且是BigDecimal(String val)這個構造方法。

5.不要使用==判斷兩個浮點數的大小

對於浮點類型之間的大小判斷,不應該使用==,而只能使用>、<、>=、<=,願意上面第4點已經說了。
樣本:

float f1=1.345f;float f2=1.123f;System.out.println(f1+f2-f2==f1);//列印false

瞭解浮點數詳細資料請查看:你的小數點去哪了
小數在電腦中的儲存形式

二進位浮點數和十進位浮點數相互轉換十進位轉二進位:

整數部分,看圖:

小數部分,看圖:

二進位轉十進位:

二進位轉十進位比較簡單,將二進位的所有面值乘以2的“字面值對應的權系”次方相加,語言不太好表達,看公式:
n1*(2^m2)+n2*(2^m2)+n3*(2^m3)+…
例如:
1101.01=1*2(2^3) +1*2(2^2)+0*(2^1)+1*(2^0)+0*(2^-1)+1*(2^-2)=8+4+0+1+0+0.25=13.25。

Java基礎資料型別 (Elementary Data Type)知識總結

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.