Categories
程式開發

你真的理解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” ,“內容”:[{“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”:“標題”,“ 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” ,“內容”:[{“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”: ““,“樣式”:[{“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} ,“內容”:[{“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”: ““,“樣式”:[{“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} ,“內容”:[{“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”: ““,“樣式”:[{“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} ,“內容”:[{“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”:“標題”,“ 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}}}

}