跳至主要內容

Java 常用类与工具

流浪码客原创Java大约 5 分钟

Java 常用类与工具

Object 通用方法

Object 类是Java编程语言中的根类(基类),具有以下特点:

  • 继承关系:所有类都直接或间接继承自 Object
  • 默认父类:如果一个类没有明确指定父类,它会自动继承 Object
  • 核心方法:提供了所有对象都具备的基本方法
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 == 0isBlank()                      → 判断是否为空白
3️⃣ 字符串查找
indexOf(...)                   → 查找子字符串首次出现位置
lastIndexOf(...)               → 查找子字符串最后出现位置
contains(...)                  → 判断是否包含某子串
4️⃣ 字符串截取
substring(begin)               → 截取子字符串(从 begin 到 结尾)
substring(begin, end)          → 截取子字符串(从 begin 到 end-1charAt(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 Stringsopen in new window
  • 前面提到:JDK8 底层使用char数组实现,JDK9+ 改用byte数组+coder编码标志
  • 背景:JDK8 String 使用 char[],每字符占 2 字节,存储 ASCII/Latin1 时存在内存浪费。
  • 优化方案:JDK9 起改为 byte[] + coder,根据字符串内容自动选择最优编码方式:
    • Latin1 编码 → 每个字符占 1 字节
    • UTF-16 编码 → 每个字符占 2 字节
  • 效果:减少内存占用,提高缓存命中率,且 API 保持兼容。

Java21 String Templatesopen in new window

内存分配演进

  1. 在 Java 中,String 是引用类型,其引用存放在栈(Stack) 中,对象内容存放在堆(Heap) 中。
  2. 通过字符串常量池(String Pool) 缓存已创建的字面量,避免重复创建对象,提高内存利用率。
  3. 利用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)               → √(+)
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 的整数(doubleMath.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;    // 圆面积

Random

时间日期(Date、Calendar、LocalDateTime 等)