Skip to content

Java 数字

Java 提供了基本数据类型(byte、int、long、double、float、short、char、boolean)用于对性能要求较高的操作。它们直接存储值。

int i = 5000;
double accountBalance = 13065.75;
byte flags = 0xAF;

然而,许多 Java API,特别是 Collections Framework,处理的是对象。为了弥合这一差距,Java 为每种基本类型提供了包装类(Integer、Long、Byte、Double、Float、Short、Character、Boolean)。这些类将基本类型值封装在一个对象中。

所有数字包装类(Integer、Long、Byte、Double、Float、Short)都扩展了抽象类 Number,提供了用于数字操作的常用方法。

现代 Java 通过自动装箱(基本类型到包装类)和自动拆箱(包装类到基本类型)简化了基本类型与其包装对象之间的转换。编译器会自动处理这些转换。

示例:

public class TestAutoboxing {
public static void main(String[] args) {
// 自动装箱:int 5 自动转换为 Integer 对象
Integer x = 5;
// 自动拆箱:Integer x 自动转换为 int 进行加法运算
x = x + 10; // x 变为 15(Integer 对象)
// 自动拆箱进行打印
System.out.println("x 的值: " + x);
// List 的示例(需要对象)
java.util.List<Integer> numberList = new java.util.ArrayList<>();
numberList.add(100); // 自动装箱:int 100 -> Integer
int firstNum = numberList.get(0); // 自动拆箱:Integer -> int
System.out.println("列表中第一个数字: " + firstNum);
}
}

输出:

Value of x: 15
First number from list: 100
  • NullPointerException:对 null 包装类引用进行自动拆箱会抛出 NullPointerException。示例:Integer num = null; int i = num; // 抛出 NPE
  • 性能:在对性能敏感的循环中过度进行自动装箱/自动拆箱会创建不必要的对象并影响性能。
  • 比较:使用 .equals() 比较包装对象的值(Integer a = 1000; Integer b = 1000; a == b 可能为 false,但 a.equals(b) 为 true)。对于对象,== 比较的是对象引用,但由于对小范围值(-128 到 127)的缓存,它可能对该范围内的值看起来有效。

包装类(Number 的子类)的实例提供了将其值转换为不同基本类型、进行比较等方法。还提供了用于解析和转换的静态工具方法。

类别常用方法及说明
实例方法(作用于包装对象,例如 Integer i = 10;)byte byteValue()、short shortValue()、int intValue()、long longValue()、float floatValue()、double doubleValue():将 Number 对象的值转换为指定的基本类型。
int compareTo(WrapperType another):将此 Number 对象与参数进行数值比较。
boolean equals(Object obj):将此 Number 对象与参数进行值相等性比较。
静态方法(作用于包装类,例如 Integer.parseInt(...))static WrapperType valueOf(primitive p) 或 static WrapperType valueOf(String s):返回表示指定基本类型或 String 值的包装对象(通常比构造函数更受欢迎)。
static primitive parsePrimitive(String s)(例如,parseInt、parseDouble):将字符串参数解析为有符号的十进制基本类型。
static String toString(primitive p):返回表示指定基本类型的 String 对象。
数学工具方法(java.lang.Math 和 java.lang.StrictMath 中的静态方法)abs(a):返回绝对值。
ceil(a):返回大于或等于参数且等于数学整数的最小 double 值。
floor(a):返回小于或等于参数且等于数学整数的最大 double 值。
rint(a):返回与参数最接近且等于数学整数的 double 值。
round(a):返回与参数最接近的 long 或 int 值(取决于参数类型)。
min(a, b):返回两个值中较小的一个。
max(a, b):返回两个值中较大的一个。
exp(a):返回 e 的 double 幂。
log(a):返回一个 double 值的自然对数(以 e 为底)。
pow(a, b):返回第一个参数的第二个参数次幂的值。
sqrt(a):返回一个 double 值的正确舍入的正平方根。
sin(a)、cos(a)、tan(a):三角函数(角度以弧度表示)。
asin(a)、acos(a)、atan(a):反三角函数。
atan2(y, x):返回从直角坐标 (x, y) 到极坐标 (r, theta) 转换得到的角 theta。
toDegrees(a):将以弧度测量的角度转换为度。
toRadians(a):将以度测量的角度转换为弧度。
random():返回一个带有正号的 double 值,大于或等于 0.0 且小于 1.0。

对于高精度计算,特别是金融计算中不允许浮点数不准确的情况,请使用 java.math.BigDecimal 类。

接下来,我们将探讨 Character 包装类以及在 Java 中如何处理字符。