模式切换
数据类型
Java 中有两大数据类型,分别是:基本数据类型和引用数据类型。
基本数据类型
Java 语言的基本数据类型包括整数类型、浮点类型、字符类型和布尔类型。在 Java 中有 8 种基本数据类型,如下图所示:
图 Java 基本数据类型
int 是基本数据类型,Integer 是 int 的封装类,是引用类型。int 默认值是 0,而 Integer 默认值为 null,所以 Integer 能区分出 0 和 null 的情况。一旦 Java 看到 null,就知道这个引用还没有指向某个对象,任何引用在使用前必须为其指定一个对象,否则会报错。
基本数据类型在声明时系统会自动给它分配空间,而引用类型声明时只是分配了引用空间,必须通过实例化开辟内存空间后才可以赋值。数组对象也是一个引用对象,将一个数组赋值给另一个数组只是复制了引用,所以修改某一个数组在另一个数组中也看得见。
虽然定义了 boolean 这种数据类型,但是只对它提供了非常有限的支持。在 JVM 中没有任何供 boolean 值专用的字节码指令,Java 语言表达式所操作的 boolean 值,在编译之后都使用 JVM 中的 int 数据类型来代替,而 boolean 数组将会被编码成 JVM 的 byte 数组,每个 boolean 元素占 8 位。这样我们可以得出 boolean 类型独占使用 4 个字节,在数组中又是 1 个字节。 使用 int 的原因是,对于当下 32 位的处理器(CPU)来说,一次处理数据是 32 位(这里不是指的是 32/64 位系统,而是指 CPU 硬件层面),具有高效存取的特点。
表 八大基本数据类型对比
整数类型
整数类型用来存储整数数值,即没有小数部分的数值。可以是正数,也可以是负数。整型数据在 Java 中有三种表示形式,分别为:八进制、十进制和十六进制。
- 八进制:以 0 开头的整数,如
010
、-010
。 - 十进制:即常见的十进制数,如
100
、-100
。除了数字 0,不能以 0 作为其他十进制数的开头。 - 十六进制:以
0x
或0X
开头的整数,如0x10
、-0x10
。
根据所占用内存大小的不同,整型数据分为四种类型:byte
、short
、int
和 long
。
表 整型数据类型
在定义整型变量时要注意取值范围,超出相应的范围就会出错。对于 long 类型的整数,若赋的值大于 int 类型的最大值或小于 int 类型的最小值,需要在数值后面加上 L
或 l
,表示这是一个长整数。
java
byte b = 100;
short s = 1000;
int i = 10000;
long l = 100000L;
byte 类型
- byte 数据类型是 8 位、有符号的,以二进制补码表示的整数。
- 最小值是
-128(-27)
。 - 最大值是
127(27-1)
。 - 默认值是 0。
- byte 类型用在大型数组中节约空间,主要代替整数,因为 byte 变量占用的空间只有 int 类型的四分之一。
- 示例:java
byte a = 100,byte b = -50
short 类型
- short 数据类型是 16 位、有符号的以二进制补码表示的整数。
- 最小值是
-32768(-2^15)
。 - 最大值是
32767(2^15-1)
。 - short 数据类型也可以像 byte 那样节省空间。一个 short 变量是 int 型变量所占空间的二分之一。
- 默认值是 0。
- 示例:java
short s = 1000; short r = -20000;
int 类型
- int 数据类型是 32 位、有符号的以二进制补码表示的整数。
- 最小值是
-2,147,483,648(-2^31)
。 - 最大值是
2,147,483,647(2^31 - 1)
。 - 一般地整型变量默认为 int 类型。
- 默认值是 0。
- 示例:java
int a = 100000; int b = -200000;
long 类型
- long 数据类型是 64 位、有符号的以二进制补码表示的整数。
- 最小值是
-9,223,372,036,854,775,808(-2^63)
。 - 最大值是
9,223,372,036,854,775,807(2^63 -1)
。 - 这种类型主要使用在需要比较大整数的系统上。
- 默认值是 0L。
- “L”理论上不分大小写,但是若写成“l”容易与数字“1”混淆,不容易分辩。所以最好大写。
- 示例:java
long a = 100000L; Long b = -200000L;
浮点类型
浮点类型用来存储带小数的数值。在 Java 中浮点类型分为:单精度浮点数(float)和双精度浮点数(double)。
表 浮点型数据类型
默认情况下,浮点数值是 double
类型的,如果要将浮点数值赋给 float
类型的变量,需要在数值后面加上 F
或 f
。
java
float f = 3.14F;
double d = 3.14;
float 类型
- float 数据类型是单精度、32 位、符合 IEEE 754 标准的浮点数。
- float 在储存大型浮点数组的时候可节省内存空间。
- 默认值是 0.0f。
- 浮点数不能用来表示精确的值,如货币。
- 示例:java
float f1 = 234.5f;
double 类型
- double 数据类型是双精度、64 位、符合 IEEE 754 标准的浮点数。
- 浮点数的默认类型为 double 类型。
- double 类型同样不能表示精确的值,如货币。
- 默认值是 0.0d。
- 例子:bash
double d1 = 7D ; double d2 = 7.; double d3 = 8.0; double d4 = 8.D; double d5 = 12.9867; # 7 是一个 int 字面量,而 7D,7. 和 8.0 是 double 字面量。
字符类型
char 类型
字符类型(char)用来存储单个字符,占用 2 个字节的内存空间。char
类型的取值范围是 0~65535,可以存储一个 Unicode 字符。在定义字符变量时,需要使用单引号将字符括起来。
java
char c = 'A';
由于字符 A 的 Unicode 编码是 65,所以上面代码可以写成:
java
char c = 65;
转义字符
转义字符是一种特殊的字符变量,它以反斜杠 \
开头,后面跟着一个字符。转义字符用于表示一些无法直接键入的字符,如换行符、制表符、回车符等。
表 转义字符
将转义字符赋值给 char
类型的变量时,需要使用单引号将转义字符括起来。
java
char c = '\n';
布尔类型
- boolean 数据类型表示一位的信息。
- 布尔类型(boolean)用来存储逻辑值,只有两个取值:
true
和false
。 - 这种类型只作为一种标志来记录
true
/false
情况。 - 默认值是
false
。 - 示例:java
boolean b = true;
引用数据类型
在 Java 中,引用类型的变量非常类似于 C/C++ 的指针。引用类型指向一个对象,指向对象的变量是引用变量。这些变量在声明时被指定为一个特定的类型,比如 Employee、Puppy 等。变量一旦声明后,类型就不能被改变了。
特点:
- 对象、数组都是引用数据类型。
- 所有引用类型的默认值都是
null
。 - 一个引用变量可以用来引用任何与之兼容的类型。
数据类型转换
数据类型转换是将一种数据类型的值转换为另一种数据类型。
如果从低精度数据类型转换为高精度数据类型,则永远不会溢出;如果从高精度数据类型转换为低精度数据类型,则可能会溢出,造成信息丢失。
Java 支持两种类型的转换:隐式类型转换和显式类型转换。
隐式类型转换(自动类型转换)
隐式转换是指在不显式指定转换的情况下,Java 自动将一种数据类型转换为另一种数据类型。这种转换通常发生在从较小范围数据类型向较大范围数据类型转换时,且不会导致数据丢失。
规则:
- 从小范围类型向大范围类型转换。
- 转换方向:text
低 ---------------------------------------> 高 byte,short,char —> int —> long—> float —> double
- char 类型可以自动转换为 int 或更高范围的类型。
示例:
java
int a = 100;
long b = a; // 自动将 int 转换为 long
float c = b; // 自动将 long 转换为 float
double d = c; // 自动将 float 转换为 double
char ch = 'A';
int e = ch; // 自动将 char 转换为 int,e 的值为 65(ASCII 码)
显式类型转换(强制类型转换)
显式转换是指程序员显式地指定将一种数据类型转换为另一种数据类型。这种转换通常发生在从较大范围数据类型向较小范围数据类型转换时,可能会导致数据丢失或精度降低。
语法:
java
(targetType) value; // (目标数据类型) 要转换的值
示例:
java
double a = 100.04;
int b = (int) a; // 强制将 double 转换为 int,b 的值为 100(小数部分丢失)
long c = 1000L;
byte d = (byte) c; // 强制将 long 转换为 byte,d 的值为 -24(数据溢出)
注意事项:
- 强制类型转换可能会导致数据丢失或精度降低。
- 在将浮点数转换为整数时,小数部分会被截断。
- 在将较大范围的整数转为较小范围的整数时,可能会导致数据溢出。