Java 是一种强类型语言,变量在声明时必须明确指定数据类型。
Java 中的数据类型主要分为两类:

  • 基本数据类型
  • 引用数据类型

Java 一共有 8 种基本数据类型,可以分为整数、浮点数、字符和布尔值四类。

分类数据类型
整数类型byte、shot、int、long
浮点数类型float、double
字符类型char
布尔类型boolean

1.整数类型

整数类型用于保存不包含小数部分的数字。

类型占用空间取值范围
byte1 字节-128 ~ 127
short2 字节-32768 ~32767
int4 字节-2^31^ ~ 2^31^-1
long8 字节-2^63^ ~ 2^63^-1

1.1 byte

byte占用空间较小,只能保存范围较小的整数。

byte age = 18;
byte temperatlure = -10;

如果数值超出 byte的范围,代码将无法通过编译。

byte number = l28 // 编译错误

1.2 short

short的取值范围比 byte更大,但在实际业务代码中使用较少。

short year = 2026
short count = 30000;

1.3 int

int是 Java 中最常用的整数类型。没有特殊要求时,普通整数通常使用 int。

int age = 20;
int studentCount = 1000;
int score = 95;

Java 中的整数字面量默认是 int类型。

1.4 long

long用于保存较大的整数,常见于数据库主键、时间戳和较大的统计数据。

long userId = 10000000001L;
long timestamp = 1770000000000L;

定义较大的 long字面量时,需要在数字后添加 L。

long number = 10000000000L;

建议使用大写 L,避免与数字 1混淆。


2.浮点类型

浮点类型用于保存带有小数部分的数字。

类型占用空间大致精度
float4 字节约 6~7 位有效数字
double8 字节约 15~16 位有效数字

2.1 float

定义 float类型的小数时,需要在数字后面添加 F或者 f。

float price = 19.9F;
float score = 95.5F;

下面的代码无法通过编译:

float price = 19.9; // 编译错误

这是因为 Java 中的小数字面量默认是 double类型。

2.2 double

double是 Java 中最常见的浮点数类型。

double height = 175.5;
double weight = 65.8;
double distance = 12345.678;

小数字面量默认就是 double类型,因此通常不需要添加后缀。


3.浮点数精度问题

float和 double使用二进制浮点数保存数据,部分十进制小数无法被精确表示。

double result = 0.1 + 0.2;
System.out.println(result);

输出结果可能是:

因此,float和 double不适用于金额等要求精确计算的场景。
金额计算通常使用 BigDecimal:

import java.math.BigDecimal;
public class MoneyDemo {
public static void main(String[] args) {
BigDecimal first = new BigDemcial("0.1");
BigDecimal second = new BigDemcial("0.2");

BigDecimal result = first.add(second);

System.out.println(result);
}
}

输出结果:

创建 BigDecimal时,通常应使用字符串参数,避免先产生浮点数精度误差。


4.字符类型

char用于保存单个字符,占用 2 个字节。

char grade = 'A';
char chinese = '中';
char number = '1';
char sysmbol = '#';

char类型必须使用单引号:

char letter = 'A';

双引号表示字符串:

String name = "Java";

String不是基本数据类型,而是引用数据类型。
需要注意,字符 '1'和整数 1是不同的数据:

char character = '1';
int number = 1;

4.1 char 与整数的关系

char保存的是字符串对应的数值,因此可以参与整数运算。

char letter = 'A';

System.out.println(letter);
System.out.((int) letter);

输出结果:

也可以通过 Unicode 编码定义字符:

char letter = '\u0041';

System.out.println(letter);

输出结果:

需要注意,char表示的是一个 UTF-16 代码单元。部分表情符号和生僻字符可能需要两个 char 才能完整表示。


5.布尔类型

boolean用于表示逻辑状态,只有两个取值:
true
false
示例:

boolean isLogin = true;
boolean isDeleted = false;
boolean passed = true;

boolean经常用于条件判断:

boolean isAdult = true;
if (isAdult) {
System.out.println("已经成年");
}

java 中不能使用 0和 1代替布尔值。

boolean flag = 1; // 编译错误

6.基本数据类型示例

public class DataTypeDemo {
public static void main(String[] args) {
byte age = 18;
short year = 2026;
int count = 100000;
long userId = 10000000001L;

float price 19.9F;
double height = 175.5;

System.out.println(age);
System.out.println(year);
System.out.println(count);
System.out.println(userId);
System.out.println(price);
System.out.println(height);
System.out.println(grade);
System.out.Println(passed);
}
}

7.基本数据类型的默认值

基本数据类型作为成员变量时,Java 会自动设置默认值。
|数据类型|默认值|
| --- | --- |
|byte|0|
|short|0|
|int|0|
|long|0L|
|float|0.0F|
|double|0.0D|
|char|'\u0000'|
|boolean|false|
示例:

public class DefaultValueDemo {

int count;
double price;
char grade;
boolean enabled;

public static void main(String[] args) {
DefaultValueDemo demo = new DefaultValueDemo();

System.out.println(demo.count);
System.out.println(demo.price);
System.out.println(demo.grade);
System.out.println(demo.enabled);
}
}

局部变量没有默认值,必须先赋值再使用。

public class LocalVariableDemo {
public static void main(String[] args) {
int number;

System.out.println(number); // 编译错误
}
}

正确写法:

int number = 10;

System.out.println(number);

8.基本数据类型

 基本数据类型之间的转换主要分为:

  • 自动类型转换
  • 强制类型转换

8.1 自动类型转换

将取值范围较小的类型转换为取值范围较大的类型时,Java 通常可以自动完成转换。

int number = 100;
long longNumber = number;
double doubleNumber = longNumber;

常见的自动转换方向为:
byte -> short -> int -> long -> float -> double
char可以先自动转换为 int、long、float、或 double。

char letter = 'A';
int number = letter;

System.out.println(number);

输出结果:

需要注意,自动转换不一定代表数值始终能够被精确保存。例如,较大的 long转换为 float时,可能产生精度损失。

8.2 强制类型转换

将取值范围较大的类型转换为取值范围较小的类型时,需要进行强制类型转换为取值较小的类型时,需要进行强制类型转换。

double price = 19.9;
int number = (int) price;

System.out.println(number);

输出结果:
19
小数部分会被直接舍弃,不会进行四舍五入。
强制转换还可能产生数据溢出:

int number = 130;
byte result = (byte) number;

System.out.println(result);

输出结果:

因此,强制类型转换需要确认原始数据是否在目标类型的取值范围内。


9.基本类型对应的包装类

Java 为每种基本数据类型提供了对应的包装类。
| 基本数据类型 | 包装类 |
| --- | --- |
|byte|Byte|
|short|Short|
|int|Interger|
|long|Long|
|float|Float|
|double|Double|
|char|Character|
|boolean|Boolean|
基本类型转换为包装类型为自动装箱:

int number = 10;
Integer integer = number;

包装类转换为基本类型称为自动拆箱:

Integer integer = 10;
int number = integer;

集合和泛型中不能直接使用基本数据类型,需要使用对应的包装类。
正确写法:

List<Integer> numbers = new ArrayList<>();

错误写法:

List<int> numbers; // 编译错误

包装类可以保存 null,基本数据类型不能保存 null:

Integer number = null;

自动拆箱时需要注意空指针异常:

Integer value = null;
int number = value; // NullPointerException

10.如何选择数据类型

实际开发中,可以按照以下方式选择:
|使用场景|推荐类型|
| --- | --- |
|普通整数|int|
|较大的整数|long|
|数据库主键|long 或包装类 Long|
|普通小数|double|
|精确金额计算|BigDecimal|
|单个字符|char|
|逻辑状态|boolean|
|二进制数据|byte|
在普通业务开发中,最常使用的基本数据类型是:

int
long
double
boolean

byte、short和 float的使用频率相对较低。