Java 基本类型与包装类详解
在 Java 开发中,理解 基本数据类型与包装类、字符串处理、以及高精度计算类是非常核心的能力。这不仅关系到程序性能,还影响代码的正确性和可维护性。本文将详细讲解这些知识点,并给出常见的使用技巧和陷阱。
1️⃣ 基本数据类型与引用类型的区别
Java 中有两种数据类型:
类型 | 示例 | 存储方式 | 特点 |
---|---|---|---|
基本数据类型 | int、long、double、boolean、char | 栈 | 存储实际值,效率高,占用空间小 |
引用数据类型 | Integer、String、数组、对象 | 堆 | 存储对象地址,支持方法调用,可为 null |
注意点:
- 基本类型默认值有固定值(如 int=0, boolean=false)
- 引用类型默认值是
null
- 基本类型操作速度快,引用类型功能丰富
2️⃣ 包装类
Java 为每个基本类型提供了对应的包装类:
基本类型 | 包装类 |
---|---|
int | Integer |
long | Long |
double | Double |
boolean | Boolean |
char | Character |
作用:
- 可以作为对象使用(如集合中存储)
- 提供一些工具方法(如 Integer.parseInt()、Double.valueOf())
示例:
int a = 10;
Integer b = Integer.valueOf(a); // 基本数据类型-->包装类 装箱
int c = b.intValue(); // 包装类-->基本数据类型 拆箱
3️⃣ 自动装箱 / 拆箱
从 Java 5 开始,Java 支持 自动装箱 和 自动拆箱:
Integer x = 100; // 自动装箱,相当于 Integer.valueOf(100)
int y = x; // 自动拆箱,相当于 x.intValue()
注意点:
- 装箱/拆箱涉及对象创建和方法调用,过度使用可能影响性能
==
比较包装类时要注意:小整数缓存(-128~127)可能导致==
为 true,大整数则可能为 false
Integer a = 127;
Integer b = 127;
System.out.println(a == b); // true
Integer c = 128;
Integer d = 128;
System.out.println(c == d); // false
4️⃣ String 与 StringBuilder / StringBuffer
4.1 不可变 vs 可变
- String:不可变,每次修改都会生成新对象
- StringBuilder / StringBuffer:可变,适合大量字符串拼接
- 线程安全:
- StringBuilder:非线程安全
- StringBuffer:线程安全(同步方法)
示例:
String str = "Hello";
str += " World"; // 每次拼接都会生成新对象StringBuilder sb = new StringBuilder("Hello");
sb.append(" World"); // 原对象修改,不生成新对象
5️⃣ Math 类常用方法
java.lang.Math
提供大量常用数学方法:
Math.abs(-10); // 绝对值
Math.max(3, 7); // 最大值
Math.min(3, 7); // 最小值
Math.pow(2, 3); // 幂
Math.sqrt(16); // 平方根
Math.round(3.6); // 四舍五入
Math.random(); // 生成 0~1 随机数
6️⃣ BigInteger / BigDecimal(高精度计算)
6.1 BigInteger
- 支持任意精度整数运算
- 常用于大数计算或加密算法
BigInteger big1 = new BigInteger("12345678901234567890");
BigInteger big2 = new BigInteger("98765432109876543210");
BigInteger sum = big1.add(big2);
System.out.println(sum);
6.2 BigDecimal
- 支持高精度浮点数运算
- 避免 double 浮点误差
double a = 0.1 + 0.2;
System.out.println(a); // 0.30000000000000004BigDecimal b1 = new BigDecimal("0.1");
BigDecimal b2 = new BigDecimal("0.2");
BigDecimal bSum = b1.add(b2);
System.out.println(bSum); // 0.3
注意点:
- 构造 BigDecimal 时尽量使用
String
构造,而不是 double - double 构造可能引入浮点误差
7️⃣ 总结
本文主要讲解了 Java 基本类型与包装类、String 与 StringBuilder/StringBuffer、Math 类方法以及 高精度计算类 BigInteger/BigDecimal 的核心知识:
- 基本类型性能高,包装类功能丰富
- 自动装箱拆箱要注意性能和
==
问题 - 字符串拼接推荐使用 StringBuilder
- BigDecimal 是处理浮点数精度问题的利器
掌握这些基础 API,是写出 健壮、高性能 Java 程序的前提。