xzhuz / blog-gitment

博客备份和comment记录
https://meisen.pro
0 stars 0 forks source link

「万丈高楼平地起」Java的8个基本数据类型 #35

Open xzhuz opened 5 years ago

xzhuz commented 5 years ago

https://meisen.pro/article/46704502f9084c30ba8a77817847137f

困而学,学而知

基础不牢,地动山摇

夯实Java基础,为架构师而努力。

8大基本数据类型对比

今天先来说说Java的8个基本数据类型: byteshortintlongfloatdoublebooleanchar。每种都有其对应的包装类型: ByteShortIntegerLongFloatDoubleBooleanCharacter。今天的主角不是包装类型,而是8个基本数据类型。为了表示得更清楚,通过一个表格来说明8个基本数据类型占用的字节数、占用多少位、默认值、最大值、最小值。

数据类型 字节数 位数 默认值 最小值 最大值 包装类型
byte 1 8 0 -128 127 Byte
short 2 16 0 -32768 32767 Short
int 4 32 0 -231 231 -1 Integer
long 8 64 0L -263 263 - 1 Long
float 4 (单精度) 32 0.0f 1.4e-45f 3.4028235e+38f Float
double 8 (双精度) 64 0.0d 4.9e-324 1.7976931348623157e+308 Double
boolean false NA NA Boolean
char 2 16 \u0000 '\u0000'(即为0) '\uffff'(即为65,535) Character

关于boolean的字节数和位数我们后面再讨论,有很多种说法

关于int和long 的最小值和最大值

每种数据类型的最小值和最大值都在其包装类型中有定义,比如说int的包装类型Integer中定义的int的最小值和最大值如下:

// int最小值-2<sup>31</sup>: -2147483648
public static final int   MIN_VALUE = 0x80000000;
// int 最大值2<sup>31</sup>: -1 2147483647
public static final int   MAX_VALUE = 0x7fffffff;

基本数据类型long的包装类型Long中的最小值和最大值如下:

// long最小值-2<sup>63</sup>: -9223372036854775808
public static final long MIN_VALUE = 0x8000000000000000L;
// long最大值2<sup>63</sup>-1:9223372036854775807
public static final long MAX_VALUE = 0x7fffffffffffffffL;

byte、short、int、long

这四个基本数据类型都是整型的数据类型,一般代码中不带符号的整型字面量,几乎都是int类型的。如果需要定义long类型的变量,需要在整型字面量后面加上大写的L。其实加上小写的l也是可以的,但是由于小写的l和整数1很相似,为了代码的可读性,一般都要求写成大写的L

定义这四个基本类型。

byte b = 1;
short s = 0;
int i = 100;
long l = 22L;

float、double

关于floatdouble需要知道floatdouble不能用于表示精确的值,比如说货币。如果要表示货币这种精度要求非常高的数据,可以使用BigDecimal

float是单精度、占4个字节,单精度的浮点数有效数字是8位。

double是双精度,占8个字节,双精度的浮点数有效数字是16位。

如果你想节约内存,可以使用float

use a float (instead of double) if you need to save memory in large arrays of floating point numbers.

注意:float是8位有效数字,第7位数字将会四舍五入

float f = 0.0f;
double d = 0.0d; // 或 double d = 0.0;

Java中不带任何后缀的浮点数默认是double类型的。

来说一道面试题:3*0.1==0.3将会返回什么?true还是false? 答案:false

char

char类型数据可以任何字符。且只能表示一个字符。

char类型是可以运算的因为char在ASCII字符编码表中,有对应的数值。

在Java中,对char类型字符运行时,直接当做ASCII表对应的整数来对待。

char c1 = 'a';
char c2 = 'b';
System.out.println(c1 + c2);
// --------输出---------
195

boolean

boolean很简单,它的默认值是false,且只有两个值truefalse。但是boolean到底占几个字节呢?

我比较赞同的一种说法是4个字节,理由来源是《Java虚拟机规范》一书中的描述:“虽然定义了boolean这种数据类型,但是只对它提供了非常有限的支持。在Java虚拟机中没有任何供boolean值专用的字节码指令,Java语言表达式所操作的boolean值,在编译之后都使用Java虚拟机中的int数据类型来代替,而boolean数组将会被编码成Java虚拟机的byte数组,每个元素boolean元素占8位”。这样我们可以得出boolean类型占了单独使用是4个字节,在数组中又是1个字节。

上面描述引自: 你真的知道Java中boolean类型占用多少个字节吗?

Java虚拟机规范

The Java Virtual Machine encodes boolean array components using 1 to represent true and 0 to represent false. Where Java programming language boolean values are mapped by compilers to values of Java Virtual Machine type int, the compilers must use the same encoding.

其实还有两种说法

数据类型之间的转换

数据类型之间是可以转换的,除了boolean之外,其他7个数据类型是可以相互转换的,并且有一个很专业的名字--自动类型转换。先来看看下一张图。

![image-20191013224703973](/Users/meisen/Library/Application Support/typora-user-images/image-20191013224703973.png)

几个注意点:

自动类型转换

必须满足转换前的数据类型的位数要低于转换后的数据类型

比如说short类型数据可以自动转换成int类型的数据,float类型的数据可以自动转换成double类型的数据。

强制类型转换

将容量大的数据类型转换成容量小的数据类型只能使用强制类型转换, 并且可能出现溢出。

强制类型转换的格式: byte i = (byte) 123;

比如说:

int i = 128;
byte j = (byte) i; // 这个时候就有可能出现溢出

以上就是本次要说的Java的基本数据类型。下次来说说包装类型中的Integer和缓存池

参考文献

Java语言规范