夯实Java基础,为架构师而努力。
8大基本数据类型对比
Java有的8
个基本数据类型: byte
、short
、int
、long
、float
、double
、boolean
、char
,同时每种都有其对应的包装类型: Byte
、Short
、Integer
、Long
、Float
、Double
、Boolean
、Character
。今天的主角是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^31: -2147483648
public static final int MIN_VALUE = 0x80000000;
// int 最大值2^31: -1 2147483647
public static final int MAX_VALUE = 0x7fffffff;
基本数据类型long
的包装类型Long
中的最小值和最大值如下:
// long最小值-2^63: -9223372036854775808
public static final long MIN_VALUE = 0x8000000000000000L;
// long最大值2^63-1:9223372036854775807
public static final long MAX_VALUE = 0x7fffffffffffffffL;
byte、short、int、long
这四个基本数据类型都是整型的数据类型,一般代码中不带符号的整型字面量,几乎都是int
类型的。如果需要定义long
类型的变量,需要在整型字面量后面加上大写的L
或l
,但小写的l
和整数1
很相似,为了代码的可读性,一般都要求写成大写的L
。
字面量
在说这整型数据类型之前,需要先来说说字面量。
见名知意,字面量就是我们见到的字表面的大小。int i = 100
,100就是字面量。String s = "abc"
,"abc"
就是字面量。
在Java中,一个整型的字面量,只有以L
或l
结尾,那就是long
类型的字面量,否者都是int
类型的字面量。超出int
范围的long
类型值可以从long
字面值创建。
整型数据类型byte
、 short
、 int
和 long
都可以通过 int
类型的字面量定义而来。
使用方法
byte b = 1;
short s = 0;
int i = 100;
long l = 22L;
float、double
关于float
和double
需要知道float
和double
不能用于表示精确的值,比如说货币。如果要表示货币这种精度要求非常高的数据,请尽量使用BigDecimal
。
float是单精度、占4个字节,单精度的浮点数有效数字是8位。
double是双精度,占8个字节,双精度的浮点数有效数字是16位。
判断浮点型字面量类型
如何判断一个浮点型字面量是什么类型的,如果这个浮点字面量以F
或f
结尾,就是float
类型的,否者这个字面量就是double类型。
如果你想节约内存,可以使用float。
use a
float
(instead ofdouble
) 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;
float和double可以也可以使用科学记数法(e)来定义:
double d1 = 123.4;
// 和d1的值是一样的,只不过使用的是科学记数法
double d2 = 1.234e2;
来说一道面试题: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
,且只有两个值true
和false
。但是boolean
到底占几个字节呢?
我比较赞同的一种说法是4个字节,理由来源是《Java虚拟机规范》一书中的描述:“虽然定义了boolean这种数据类型,但是只对它提供了非常有限的支持。在Java虚拟机中没有任何供boolean值专用的字节码指令,Java语言表达式所操作的boolean值,在编译之后都使用Java虚拟机中的int数据类型来代替,而boolean数组将会被编码成Java虚拟机的byte数组,每个元素boolean元素占8位”。这样我们可以得出boolean类型占了单独使用是4个字节,在数组中又是1个字节。
上面描述引自: 你真的知道Java中boolean类型占用多少个字节吗?
The Java Virtual Machine encodes
boolean
array components using1
to representtrue
and0
to representfalse
. Where Java programming languageboolean
values are mapped by compilers to values of Java Virtual Machine typeint
, the compilers must use the same encoding.
其实还有两种说法
-
1个bit
理由是boolean类型的值只有true和false两种逻辑值,在编译后会使用1和0来表示,这两个数在内存中只需要1位(bit)即可存储,位是计算机最小的存储单位。
-
1个字节
理由是虽然编译后1和0只需占用1位空间,但计算机处理数据的最小单位是1个字节,1个字节等于8位,实际存储的空间是:用1个字节的最低位存储,其他7位用0填补,如果值是true的话则存储的二进制为:0000 0001,如果是false的话则存储的二进制为:0000 0000。
数据类型之间的转换
数据类型之间是可以转换的,除了boolean之外,其他7个数据类型是可以相互转换的,并且有一个很专业的名字--自动类型转换。
虽然数据类型之间可以相互转换,但是还是要注意下面几点:
- boolean不能转换成其他基本类型
- 在把容量大的类型转换为容量小的类型时必须使用强制类型转换,且会存在精度丢失的问题。
- 转换过程中可能会溢出或精度丢失。
- 浮点数到整数的转换是通过舍弃小数得到,而不是四舍五入。
自动类型转换
自动类型转换也叫做隐式类型转换。
用文字的话,就可以如下表达:
- byte型可以转换为short、int、long、float和double
- short可转换为int、long、float和double
- char可转换为int、long、float和double
- int可转换为long、float和double
- long可转换为float和double
- float可转换为double;
自动类型转换必须满足转换前的数据类型的位数要低于转换后的数据类型
比如说short
类型数据可以自动转换成int
类型的数据,float
类型的数据可以自动转换成double
类型的数据。
强制类型转换
将容量大的数据类型转换成容量小的数据类型只能使用强制类型转换, 并且可能出现溢出。
强制类型转换的格式: byte i = (byte) 123
;
比如说:
int i = 128;
byte j = (byte) i; // 这个时候就有可能出现溢出
参考文献
[Java语言规范](