你真的理解 Java 的基礎數據類型嗎

{"type":"doc","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"Java 中的基礎數據類型有 8 種,分別是:byte, boolean, short, char int, float, long double。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"如果要理解這些基礎類型如何存儲數據,需要知道兩個基礎知識:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","content":[{"type":"paragraph","content":[{"type":"text","text":"所有"},{"type":"text","marks":[{"type":"strong"}],"text":"數據"},{"type":"text","text":"都是使用二進制表示"}]}]},{"type":"listitem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"strong"}],"text":"數值"},{"type":"text","text":"類型一律使用補碼來表示"}]}]}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"整數類型"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"byte 是存儲整數的最小類型,只佔 1 個字節,因爲還需要表示負數,因此只能保存 -128 ~ 127 範圍內的數據。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"如果把一個超出範圍的數值賦值給 byte 會怎麼樣?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"直接賦值無法編譯通過:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"java"},"content":[{"type":"text","text":"byte b = 129; // 編譯通不過"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"需要通過強轉才能編譯通過,但得到值不是我們所期望的:"}]},{"type":"codeblock","attrs":{"lang":"java"},"content":[{"type":"text","text":"byte b = (byte)129; // -127 "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"爲什麼會出現這樣的結果呢?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"129 使用二進制表示就是 10000001,但因爲所有的數值類型都是使用補碼來表示,在強制轉換之後,第一位會被認爲是符號位,表示負數。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"負數補碼的反碼是除符號位以外取反,所以是:11111110。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"負數的原碼是反碼加1,所以是 11111111,也就是 -127。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"short,int,long 與 byte 沒有太大區別,唯一的區別就在於佔據的字節數量不一樣。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","content":[{"type":"paragraph","content":[{"type":"text","text":"short 佔據 2 個字節,表示的範圍是: -32768 ~ 32767"}]}]},{"type":"listitem","content":[{"type":"paragraph","content":[{"type":"text","text":"int 佔據 4 個字節,表示的範圍是:-2147483648 ~ 2147483647"}]}]},{"type":"listitem","content":[{"type":"paragraph","content":[{"type":"text","text":"long 佔據 8 個字節,表示的範圍是:-9223372036854775808 ~ 9223372036854775807"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"浮點數類型"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"Java 中的浮點數有 float 和 double 兩種,按照 IEEE754 標準來實現,分別佔 4 個字節和 8 個字節。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"以 float 來說,總共有 32 位:"}]},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/f4/f41f67b9ff2fad1e01558338e02fb4b5.png","alt":null,"title":"","style":[{"key":"width","value":"100%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"float 同樣也有符號,所以第 1 位是符號位 (s),後面 8 位是指數位(e),最後面 23 位表示的是小數位(m),形式如下:"}]},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/d3/d3a6a118d38478c1d7e0d2ee41eb403b.png","alt":null,"title":"","style":[{"key":"width","value":"100%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這是需要注意的是因爲是二進制,所以基數是 2,因爲指數 e 有 8 位,所以範圍是 -128 ~ 127。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"比如說有一個浮點數:1001.11,按照上面的形式,如下:"}]},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/6b/6be2cd1dd6a6ca34a8784f8bfcf18310.png","alt":null,"title":"","style":[{"key":"width","value":"25%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"因爲浮點數的小數位會因爲精度的問題而出現變化,所以不能使用 == 去比較兩個浮點數,否則可能出現意想不到的情況。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"double 除了位數不一樣,其他與 float 一致。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"布爾類型"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"boolean 的情況比較特殊,boolean 賦值時只能選擇 true 或者 false,無法賦值其他的值。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"但是在編譯時會將 false 換成 0,將 true 換成非零數。 "}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"字符類型"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"由於 Java 使用的是 Unicode,所以作爲基本的字符單元,char 使用了 2 個字節的空間,char 實際存儲的是該字符在 Unicode 字符集內中的排序位置,即整數。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"java"},"content":[{"type":"text","text":"char b = 'a' + 1; // 98"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"每個 char 只能存儲一個字符,所以存儲一些英文字符時會浪費一些空間。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"java"},"content":[{"type":"text","text":"// 成爲另一個字符,而不是像字符串拼接一樣\nchar c = 'a' + 'b'; // Ã"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在 Java8 之前,String 使用 char 數組來存儲字符串,但是從 Java 9 以後,已經替換成 byte 數組了,因爲更加靈活,而且存儲的效率也更高。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章