Java 常用类与工具
原创大约 5 分钟
Java 常用类与工具
Object 通用方法
Object
类是Java编程语言中的根类(基类),具有以下特点:
- 继承关系:所有类都直接或间接继承自
Object
类 - 默认父类:如果一个类没有明确指定父类,它会自动继承
Object
类 - 核心方法:提供了所有对象都具备的基本方法

对象包装器与自动装箱
Java 为每种基本数据类型提供了对应的包装类(Wrapper Class),其特点如下:
- 所有包装类位于
java.lang
包中,均为final
类 - 包装类是引用类型,可以像对象一样使用基本类型

从 Java 5 开始,JDK 支持了自动装箱/拆箱(Autoboxing / Unboxing),简化了基本类型与包装类之间的转换:
Integer i = 100; // 装箱:基本类型 → 包装类对象
int j = i; // 拆箱:包装类对象 → 基本类型
根据 Java 自动装箱规范,部分包装类在特定范围内使用缓存池(CachePool) 复用对象,提高性能,避免重复创建:
- Boolean:缓存
true
/false
- Character:缓存
\u0000 ~ \u007F
(0 ~ 127) - Byte:缓存所有取值范围
[-128, 127]
- Short / Integer/Long:默认缓存
[-128, 127]
,其中Integer
上限可通过 JVM 参数调整(-XX:AutoBoxCacheMax=<size>
) - Float / Double:不使用缓存
String
String 是 Java 中最常用的引用类型之一,使用final
修饰,具有不可变性(Immutable
)。
- 位于
java.lang
包中 - 线程安全,可被多个线程共享
- JDK8 底层使用
char
数组实现,JDK9+ 改用byte
数组+coder
编码标志
String API
1️⃣ 字符串创建
String s = "..." → 字面量创建(常量池复用)
new String(...) → 构造函数创建(堆中新建对象)
2️⃣ 长度与空值判断
length() → 获取字符串的长度
isEmpty() → 判断是否为空(即:length == 0)
isBlank() → 判断是否为空白
3️⃣ 字符串查找
indexOf(...) → 查找子字符串首次出现位置
lastIndexOf(...) → 查找子字符串最后出现位置
contains(...) → 判断是否包含某子串
4️⃣ 字符串截取
substring(begin) → 截取子字符串(从 begin 到 结尾)
substring(begin, end) → 截取子字符串(从 begin 到 end-1)
charAt(index) → 获取指定位置字符
5️⃣ 字符串拼接
+ → 最常用
concat(...) → 辅助拼接
String.join(delimiter, ...) → 多字符串拼接
6️⃣ 字符串替换
replace(old, new) → 替换字符或子串
replaceAll(regex, replacement) → 正则全局替换
7️⃣ 大小写转换
toUpperCase() → 转大写
toLowerCase() → 转小写
8️⃣ 字符串比较
equals(...) → 精确比较
equalsIgnoreCase(...) → 忽略大小写
compareTo(...) → 字典序比较(负数/0/正数表示小于/相等/大于)
9️⃣ 类型转换与格式化
String.valueOf(...) → 基本类型转字符串
String.format(...) → 模板格式化
toCharArray() → 字符串转字符数组(char[])
JDK9+ Compact Strings
- JEP 254: Compact Strings
- 前面提到:JDK8 底层使用
char
数组实现,JDK9+ 改用byte
数组+coder
编码标志。 - 背景:JDK8 String 使用
char[]
,每字符占 2 字节,存储 ASCII/Latin1 时存在内存浪费。 - 优化方案:JDK9 起改为
byte[] + coder
,根据字符串内容自动选择最优编码方式:Latin1
编码 → 每个字符占 1 字节UTF-16
编码 → 每个字符占 2 字节
- 效果:减少内存占用,提高缓存命中率,且 API 保持兼容。
Java21 String Templates
内存分配演进
- 在 Java 中,String 是引用类型,其引用存放在栈(Stack) 中,对象内容存放在堆(Heap) 中。
- 通过字符串常量池(String Pool) 缓存已创建的字面量,避免重复创建对象,提高内存利用率。
- 利用
String.intern()
方法,将字符串对象放入常量池,并返回常量池中的对象引用。
HotSpot中字符串常量池保存哪里?
JDK 版本 | 常量池位置 | 说明 |
---|---|---|
≤ JDK6 | 方法区(Method Area / PermGen) | 字符串常量池在类加载阶段创建,固定大小,存储在永久代中 |
JDK7 | 堆(Heap) | 为了扩展灵活性,字符串常量池移到了堆,JVM 管理更方便 |
≥ JDK8 | 堆(Heap) | 方法区被移除(PermGen 被 Metaspace 替代),字符串常量池仍在堆上,String.intern() 的对象存储在堆中 |
Arrays
Arrays
类位于 java.util
包,是 Java 提供的数组工具类,特点如下:
https://xie.infoq.cn/article/20df7ca933752601ee20be264
Math
Math 类位于 java.lang
包,是 Java 提供的数学工具类。特点如下:
- 使用
final
修饰,具有不可变性(Immutable
),线程安全 - 方法均为
static
,无需创建对象即可调用 - 用途:支持基本运算(如加减乘除、取绝对值)、幂运算、三角函数、对数与指数运算、舍入操作,以及生成随机数等
Math API
1️⃣ 基本数学运算
Math.abs(x) → 绝对值
Math.max(a, b) → 最大值
Math.min(a, b) → 最小值
Math.signum(x) → 符号函数 (-1/0/1)
2️⃣ 幂运算与开方
Math.pow(a, b) → a 的 b 次幂
Math.sqrt(x) → 平方根
Math.cbrt(x) → 立方根
Math.hypot(x, y) → √(x² + y²)
3️⃣ 指数与对数
Math.exp(x) → e 的 x 次幂
Math.expm1(x) → e^x - 1
Math.log(x) → 自然对数 ln(x)
Math.log10(x) → 以 10 为底的对数
Math.log1p(x) → ln(1+x),高精度
4️⃣ 三角函数
Math.sin(x) / Math.cos(x) / Math.tan(x) → 正弦/余弦/正切
Math.asin(x) / Math.acos(x) / Math.atan(x) → 反三角函数
Math.atan2(y, x) → y/x 的角度(弧度)
5️⃣ 舍入与取整
Math.ceil(x) → 向上取整
Math.floor(x) → 向下取整
Math.rint(x) → 返回最接近 x 的整数(double)
Math.round(x) → 四舍五入
Math.floorDiv(a, b) → 整数除法向下取整
Math.floorMod(a, b) → 向下取整取模
6️⃣ 随机数与常量
Math.random() → 返回 [0~1) 之间随机 double
Math.PI → π 常量
Math.E → e 常量
常见用法
1️⃣ 分页计算
int pages = (int) Math.ceil(totalItems / (double) pageSize); // 向上取整
2️⃣ 随机数生成
int randInt = (int) (Math.random() * n); // 0 ~ n-1
double randDouble = Math.random() * (max - min) + min; // min ~ max
boolean flip = Math.random() < 0.5; // 随机布尔
3️⃣ 数值比较与约束
int value = Math.max(minValue, Math.min(maxValue, inputValue)); // 限定范围 [minValue, maxValue]
4️⃣ 取整与舍入
double d = 2.7;
double ceil = Math.ceil(d); // 3.0 向上取整
double floor = Math.floor(d); // 2.0 向下取整
long round = Math.round(d); // 3 四舍五入
5️⃣ 几何与距离计算
double distance = Math.hypot(x2 - x1, y2 - y1); // 两点间欧几里得距离
6️⃣ 幂运算
double area = Math.pow(radius, 2) * Math.PI; // 圆面积