Java进阶——数据类型深入解析
Java数据类型深入解析
本文主要介绍 Java 数据类型的相关知识,包括8 种基本类型、默认值、字面量表示、自动装箱与拆箱、类型转换规则(隐式转换、强制转换)、浮点型精度问题、字符与字符串、引用类型比较与常量池、数值溢出与处理、类型推断等等。
本文目录
- 基本数据类型分类与特性
- 自动装箱与拆箱
- 类型转换规则
- 浮点型精度问题
- 字符与字符串
- 数组特性
- 引用类型比较与常量池
- 数值溢出与处理
- 类型推断(Java 10+)
- 其他注意事项
- 业务场景下的最佳实践
基本数据类型分类与特性
- 8种基本类型:
- 整型:
byte
(8位)、short
(16位)、int
(32位,默认)、long
(64位,需加L
后缀)。 - 浮点型:
float
(32位,需加F
后缀)、double
(64位,默认)。 - 字符型:
char
(16位Unicode,单引号)。 - 布尔型:
boolean
(仅true
/false
,不可与整数互换)。
- 整型:
- 默认值:整型/浮点型默认
0
,布尔型默认false
,引用类型默认null
。 - 字面量表示:
long num = 100L;
float f = 3.14F;
未加后缀的浮点默认为double
。
自动装箱与拆箱
- 包装类缓存机制:
Integer
、Byte
等包装类缓存-128~127
的值,Integer.valueOf(127) == Integer.valueOf(127)
为true
,但new Integer(127)
会创建新对象。- 比较陷阱:包装类对象需用
equals()
而非==
比较值。
Integer a = 127; // 使用缓存对象
Integer b = 127;
System.out.println(a == b); // true(-128~127范围内)
Integer x = 200;
Integer y = 200;
System.out.println(x.equals(y)); // true
- 性能影响:频繁装箱拆箱(如循环内)会导致额外对象创建,影响性能。
类型转换规则
- 隐式转换(自动提升):
- 小类型转大类型自动提升(如
byte→int
)。 - 表达式运算中,
byte
/short
提升为int
,float
与double
混合提升为double
。
- 小类型转大类型自动提升(如
- 强制转换:
- 大类型转小类型需显式转换,可能丢失精度(如
double→int
截断小数)。 - 示例:
- 大类型转小类型需显式转换,可能丢失精度(如
byte b = (byte) (a + 1); // a为byte时仍需强制转换
浮点型精度问题
- 避免精确计算:
float
/double
不适合金融计算(如0.1
无法精确表示),应使用BigDecimal
。
double price1 = 0.1;
double price2 = 0.2;
System.out.println(price1 + price2); // 输出0.30000000000000004(精度问题!)
BigDecimal total = new BigDecimal("0.1").add(new BigDecimal("0.2"));
System.out.println(total); // 0.3
字符与字符串
- 字符串不可变性:
String
修改会创建新对象,频繁拼接用StringBuilder
。
// 低效方式:频繁创建新对象
String orderId = "ORDER";
for (int i = 0; i < 1000; i++) {
orderId += "-" + i; // 每次循环生成新String对象
}
// 高效方式:使用StringBuilder
StringBuilder builder = new StringBuilder("ORDER");
for (int i = 0; i < 1000; i++) {
builder.append("-").append(i);
}
String finalOrderId = builder.toString();
- 字符串常量池:
String s1 = "abc";
(常量池)与String s2 = new String("abc");
(堆)不同对象。intern()
方法可将字符串加入常量池。
String s1 = new String("ABC").intern();
String s2 = "ABC";
System.out.println(s1 == s2); // true
数组特性
- 固定长度与默认值:
- 数组长度不可变,动态扩容需用
ArrayList
。 - 元素默认值:整型为
0
,布尔型为false
,引用类型为null
。
- 数组长度不可变,动态扩容需用
// 固定长度数组的局限性
Product[] products = new Product[10];
products[0] = new Product();
// 动态扩容推荐使用ArrayList
List<Product> productList = new ArrayList<>();
productList.add(new Product()); // 自动扩容
int[] counts = new int[5];
System.out.println(counts[0]); // 0(基本类型默认值)
Product[] products2 = new Product[5];
System.out.println(products2[0]); // null(引用类型默认值)
引用类型比较与常量池
==
与equals()
:==
比较引用地址,equals()
比较值。
数值溢出与处理
- 溢出风险:
- 整型运算超出范围会循环(如
Integer.MAX_VALUE + 1 → Integer.MIN_VALUE
)。 - 大数值用
BigInteger
或long
。
- 整型运算超出范围会循环(如
long bigNumber = 3000000000L; // 超出int范围时必须加L后缀
类型推断(Java 10+)
var
关键字:- 仅限局部变量,需初始化(如
var list = new ArrayList<String>();
)。 - 不可用于方法参数或返回值。
- 仅限局部变量,需初始化(如
其他注意事项
- 枚举类型:
enum
是引用类型,用于定义固定常量集合。
public enum OrderStatus {
PENDING, PAID, SHIPPED, DELIVERED, CANCELLED
}
// 使用示例
OrderStatus status = OrderStatus.PAID;
if (status == OrderStatus.PAID) {
System.out.println("订单已支付!");
}
- 转义字符:如
\n
(换行)、\t
(制表符)、\\
(反斜杠)。
业务场景下的最佳实践
- 金额计算:无条件使用
BigDecimal
,避免double
精度问题。 - 高频数值操作:优先使用基本类型(如
int
),减少自动装箱开销。 - 字符串拼接:使用
StringBuilder
或StringBuffer
(线程安全)。 - 状态管理:利用
enum
替代魔法数字,提升代码可读性。 - 数据校验:用户输入转换时务必捕获
NumberFormatException
。
// 用户输入的字符串转整型
String input = "10";
try {
int quantity = Integer.parseInt(input); // 可能抛出NumberFormatException
} catch (NumberFormatException e) {
System.out.println("输入非数字!");
}
← 上一篇 Java进阶——Stream流以及常用方法详解 |
记得点赞、关注、收藏哦!
| 下一篇 Java进阶——注解一文全懂 → |