[巩固Java]基本数据类型
有一组类型在 Java 中使用频率很高,它们需要特殊对待,这就是 Java 的基本类型。之所以这么说,是因为它们的创建并不是通过 new
关键字来产生。通常 new
出来的对象都是保存在堆内存
中的,以此方式创建小而简单的变量往往是不划算的。所以对于这些基本类型的创建方法,Java 使用了和 C/C++ 一样的策略。也就是说,不是使用 new
创建变量,而是使用一个“自动”变量。这个变量直接存储"值",并置于栈内存
中,因此更加高效。
注:Java 是一种强类型语言。这就意味着必须为每一个变量声明一种类型(Python 就是弱类型语言,声明变量即可自动匹配数据类型)。
Java 确定了每种基本类型的内存占用大小。这些大小不会像其他一些语言那样随着机器环境的变化而变化。这种不变性也是 Java 更具可移植性的一个原因。
基本类型 | 大小 | 最小值 | 最大值 | 默认值 |
---|---|---|---|---|
boolean | — | — | — | false |
char | 16 bits | \u0000 即为0 | \uffff 即为65535 | null |
byte | 8 bits | -128(-2^7) | 127(2^7-1) | 0 |
short | 16 bits | -32768(-2^15) | 32767(2^15 - 1) | 0 |
int | 32 bits | -2,147,483,648(-2^31) | 2,147,483,647(2^31 - 1) | 0 |
long | 64 bits | -9,223,372,036,854,775,808(-2^63) | 9,223,372,036,854,775,807(2^63 -1) | 0L |
float | 32 bits | 符合IEEE 754标准 | 符合IEEE 754标准 | 0.0f |
double | 64 bits | 符合IEEE 754标准 | 符合IEEE 754标准 | 0.0d |
注:
字节、字、位、比特之间的关系是:
1位=1比特;1字=2字节;1字节=8位;1字=16位。
bit和byte同译为"比特",都是数据量度单位,bit=“比特”或“位”。
byte=字节即1byte=8bits,两者换算是1:8的关系。
例如:
1KB = 1024 byte =2^10 byte
1MB = 1024 KB = 2^20 byte
1GB = 1024 MB = 2^30 byte
1、位
位是计算机存储的最小单位,简记为b,也称为比特(bit)计算机中用二进制中的0和1来表示数据,一个0或1就代表一位。位数通常指计算机中一次能处理的数据大小;
2、比特
比特(bit)是由英文BIT音译而来,比特同时也是二进制数字中的位,是信息量的度量单位,为信息量的最小单位;
3、字节
字节,英文Byte,是计算机用于计量存储容量的一种计量单位,通常情况下一字节等于八位,字节同时也在一些计算机编程语言中表示数据类型和语言字符,在现代计算机中,一个字节等于八位;
4、字
字是表示计算机自然数据单位的术语,在某个特定计算机中,字是其用来一次性处理事务的一个固定长度的位(bit)组,在现代计算机中,一个字等于两个字节。
测试:
public class PrimitiveTypeTest {
public static void main(String[] args) {
// byte
System.out.println("基本类型:byte 二进制位数:" + Byte.SIZE);
System.out.println("包装类:java.lang.Byte");
System.out.println("最小值:Byte.MIN_VALUE=" + Byte.MIN_VALUE);
System.out.println("最大值:Byte.MAX_VALUE=" + Byte.MAX_VALUE);
System.out.println();
// short
System.out.println("基本类型:short 二进制位数:" + Short.SIZE);
System.out.println("包装类:java.lang.Short");
System.out.println("最小值:Short.MIN_VALUE=" + Short.MIN_VALUE);
System.out.println("最大值:Short.MAX_VALUE=" + Short.MAX_VALUE);
System.out.println();
// int
System.out.println("基本类型:int 二进制位数:" + Integer.SIZE);
System.out.println("包装类:java.lang.Integer");
System.out.println("最小值:Integer.MIN_VALUE=" + Integer.MIN_VALUE);
System.out.println("最大值:Integer.MAX_VALUE=" + Integer.MAX_VALUE);
System.out.println();
// long
System.out.println("基本类型:long 二进制位数:" + Long.SIZE);
System.out.println("包装类:java.lang.Long");
System.out.println("最小值:Long.MIN_VALUE=" + Long.MIN_VALUE);
System.out.println("最大值:Long.MAX_VALUE=" + Long.MAX_VALUE);
System.out.println();
// float
System.out.println("基本类型:float 二进制位数:" + Float.SIZE);
System.out.println("包装类:java.lang.Float");
System.out.println("最小值:Float.MIN_VALUE=" + Float.MIN_VALUE);
System.out.println("最大值:Float.MAX_VALUE=" + Float.MAX_VALUE);
System.out.println();
// double
System.out.println("基本类型:double 二进制位数:" + Double.SIZE);
System.out.println("包装类:java.lang.Double");
System.out.println("最小值:Double.MIN_VALUE=" + Double.MIN_VALUE);
System.out.println("最大值:Double.MAX_VALUE=" + Double.MAX_VALUE);
System.out.println();
// char
System.out.println("基本类型:char 二进制位数:" + Character.SIZE);
System.out.println("包装类:java.lang.Character");
// 以数值形式而不是字符形式将Character.MIN_VALUE输出到控制台
System.out.println("最小值:Character.MIN_VALUE="
+ (int) Character.MIN_VALUE);
// 以数值形式而不是字符形式将Character.MAX_VALUE输出到控制台
System.out.println("最大值:Character.MAX_VALUE="
+ (int) Character.MAX_VALUE);
}
}
// 运行结果
基本类型:byte 二进制位数:8
包装类:java.lang.Byte
最小值:Byte.MIN_VALUE=-128
最大值:Byte.MAX_VALUE=127
基本类型:short 二进制位数:16
包装类:java.lang.Short
最小值:Short.MIN_VALUE=-32768
最大值:Short.MAX_VALUE=32767
基本类型:int 二进制位数:32
包装类:java.lang.Integer
最小值:Integer.MIN_VALUE=-2147483648
最大值:Integer.MAX_VALUE=2147483647
基本类型:long 二进制位数:64
包装类:java.lang.Long
最小值:Long.MIN_VALUE=-9223372036854775808
最大值:Long.MAX_VALUE=9223372036854775807
基本类型:float 二进制位数:32
包装类:java.lang.Float
最小值:Float.MIN_VALUE=1.4E-45
最大值:Float.MAX_VALUE=3.4028235E38
基本类型:double 二进制位数:64
包装类:java.lang.Double
最小值:Double.MIN_VALUE=4.9E-324
最大值:Double.MAX_VALUE=1.7976931348623157E308
基本类型:char 二进制位数:16
包装类:java.lang.Character
最小值:Character.MIN_VALUE=0
最大值:Character.MAX_VALUE=65535
Tip
-
在 Java 中, 整型的范围与运行 Java 代码的机器无关(平台无关性),由于 Java 程序必须保证在所有机器上都能够得到相同的运行结果, 所以各种数据类型的取值范围必须固定。同样的,由于这个原因 ,Java 中也没有
sizeof
。 -
从 Java 7 开始, 加上前缀 0b 或 0B 就可以写二进制数。例如,0b1001 就是 9。另外,同样是 从 Java 7 开始,还可以为数字字面量加下划线,如用 1_000_000 表示一百万。这些下划线只是为了提高可读性,Java 编译器会去除这些下划线。
-
Java 没有任何无符号(unsigned) 形式的 int、 long、short 或 byte 类型。
-
float
类型的数值有一个后缀 F 或 f (例如,3.14F) 。没有后缀 F 的浮点数值(如 3.14 ) 默认为double
类型。当然,也可以在浮点数值后面添加后缀 D 或 d (例如,3.14D) 。 -
char
类型的字面量值要用单引号括起来。 -
在 Java 中,整数表达式 x = 0 不能转换为布尔值,做if判断时x=0不通过编译。
-
高精度数值 BigInteger / BigDecimal,如果基本的整数和浮点数精度不能够满足需求, 那么可以使用
java.math
包中的两个很有用的类:Biglnteger
和BigDecimal
这两个类可以处理包含任意长度数字序列的数值。Biglnteger
类实现了任意精度的整数运算,BigDecimal
实现了任意精度的浮点数运算。