Java核心工具类与常用API深度解析
Math类关键方法详解
Math类提供了丰富的数学运算静态方法,但在使用中需要注意精度与边界问题。
绝对值方法的陷阱
以int类型为例,其取值范围为-2147483648到2147483647。当传入-2147483648时,由于没有对应的正数值,Math.abs()会返回错误的负值。
System.out.println(Math.abs(-2147483648)); // 输出 -2147483648,结果错误
System.out.println(Math.abs(-2147483647)); // 输出 2147483647,结果正确
平方根与立方根计算
Math.sqrt(4) // 返回 2.0,计算平方根
Math.cbrt(8) // 返回 2.0,计算立方根
生成随机数
// 生成1到100之间的随机整数
System.out.println(Math.floor(Math.random() * 100 + 1));
System类实用方法
System类作为工具类,提供了和系统环境交互的功能。
// 终止当前运行的Java虚拟机
System.exit(0);
// 获取当前时间戳(毫秒)
long currentMillis = System.currentTimeMillis();
System.out.println(currentMillis);
// 数组拷贝
int[] sourceArr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int[] destArr = new int[10];
System.arraycopy(sourceArr, 0, destArr, 0, sourceArr.length);
// 注意事项:
// 1. 源数组和目标数组若均为基本类型,则类型必须一致
// 2. 拷贝时需确保目标数组长度足够,否则会抛异常
// 3. 若涉及引用类型,子类类型可赋给父类类型
Runtime类核心功能
// 获取Runtime实例(单例模式)
Runtime runtime = Runtime.getRuntime();
// 立即关闭虚拟机
Runtime.getRuntime().exit(0);
// 获取可用处理器核心数
System.out.println(Runtime.getRuntime().availableProcessors());
// 最大可用内存(字节)
System.out.println(Runtime.getRuntime().maxMemory());
// 已分配总内存
System.out.println(Runtime.getRuntime().totalMemory());
// 剩余可用内存
System.out.println(Runtime.getRuntime().freeMemory());
// 执行系统命令
Runtime.getRuntime().exec("notepad");
Runtime.getRuntime().exec("shutdown -a"); // 取消关机
Object类核心方法
Object是所有类的根父类,其方法可被任意子类继承和重写。
equals()方法比较逻辑
默认实现比较对象内存地址。重写后可实现基于内容的比较。
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Person person = (Person) obj;
return age == person.age && Objects.equals(name, person.name);
}
toString()方法
默认返回"类名@哈希码十六进制"。重写后可展示对象属性值。
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + "}";
}
clone()方法与深浅拷贝
浅拷贝仅复制引用地址,深拷贝会递归复制引用对象。
public class User implements Cloneable {
private String username;
private int[] scores;
@Override
protected Object clone() throws CloneNotSupportedException {
User clonedUser = (User) super.clone(); // 执行浅拷贝
clonedUser.scores = this.scores.clone(); // 手动深拷贝数组
return clonedUser;
}
}
Objects工具类
Objects.equals()
可安全处理null值,避免空指针异常。
String str1 = null;
String str2 = "world";
System.out.println(Objects.equals(str1, str2)); // false
System.out.println(Objects.equals(str1, null)); // true
Objects.isNull()与Objects.nonNull()
提供语义化的null检查。
Object obj = new Object();
boolean isNull = Objects.isNull(obj); // 等价于 obj == null
boolean nonNull = Objects.nonNull(obj); // 等价于 obj != null
hashCode()方法
重写equals时必须同时重写hashCode,以保证哈希表数据结构的正常运作。
@Override
public int hashCode() {
return Objects.hash(name, age);
}
BigInteger大整数操作
对象创建方式
// 通过字符串创建(推荐处理超大数值)
BigInteger bigVal = new BigInteger("99999999999999999999");
// 通过valueOf创建(内部缓存 -16 到 16 的值)
BigInteger cachedVal = BigInteger.valueOf(10);
常用运算方法
BigInteger x = new BigInteger("1234567890");
BigInteger y = new BigInteger("9876543210");
BigInteger sum = x.add(y); // 加法
BigInteger diff = x.subtract(y); // 减法
BigInteger product = x.multiply(y); // 乘法
BigInteger quotient = x.divide(y); // 除法
BigInteger remainder = x.mod(y); // 取模
BigInteger power = x.pow(5); // 幂运算
BigInteger gcd = x.gcd(y); // 最大公约数
BigInteger[] divAndRem = x.divideAndRemainder(y); // 同时获取商和余数
BigDecimal高精度小数
创建建议
// 推荐使用字符串构造,避免精度丢失
BigDecimal preciseNum = new BigDecimal("123.456");
// 或使用静态方法valueOf
BigDecimal safeNum = BigDecimal.valueOf(123.456);
运算与舍入模式
BigDecimal a = new BigDecimal("10.5");
BigDecimal b = new BigDecimal("3.2");
BigDecimal sum = a.add(b);
BigDecimal diff = a.subtract(b);
BigDecimal product = a.multiply(b);
// 除法必须指定舍入模式
BigDecimal quotient = a.divide(b, RoundingMode.HALF_UP); // 四舍五入