包装类常用方法
你有没有被 parseInt 和 valueOf 搞混过?
java
int a = Integer.parseInt("100"); // 返回 int
Integer b = Integer.valueOf("100"); // 返回 Integer两个方法都能把字符串转成数字,但返回值完全不同。
这还只是冰山一角。包装类的方法多得很,用对了是利器,用错了是坑。
Integer 方法矩阵
Integer 是最常用的包装类,方法也最丰富。
1. 字符串解析:parseInt vs valueOf
java
public class ParseVsValueOf {
public static void main(String[] args) {
// parseInt:返回基本类型
int n1 = Integer.parseInt("123");
System.out.println("parseInt: " + n1 + ", 类型: " + ((Object)n1).getClass().getSimpleName());
// 输出:parseInt: 123, 类型: Integer
// 等等,输出为什么是 Integer?
// 因为 println 会自动装箱,n1 被 Integer.valueOf(123) 装箱了
// valueOf:返回包装类
Integer n2 = Integer.valueOf("123");
System.out.println("valueOf: " + n2 + ", 类型: " + n2.getClass().getSimpleName());
// 输出:valueOf: 123, 类型: Integer
// 进制解析:parseInt 支持任意进制
int binary = Integer.parseInt("1010", 2); // 二进制 1010 = 十进制 10
int octal = Integer.parseInt("777", 8); // 八进制 777 = 十进制 511
int hex = Integer.parseInt("FF", 16); // 十六进制 FF = 十进制 255
System.out.println("二进制: " + binary); // 10
System.out.println("八进制: " + octal); // 511
System.out.println("十六进制: " + hex); // 255
// 异常处理
try {
Integer.parseInt("abc");
} catch (NumberFormatException e) {
System.out.println("解析失败: 不是有效数字");
}
}
}实战选择:
- 需要
int→parseInt() - 需要
Integer→valueOf() - 需要进制转换 →
parseInt(str, radix)
2. 进制转换:toBinaryString vs toHexString
java
public class RadixConversion {
public static void main(String[] args) {
int num = 255;
// 转二进制
System.out.println("二进制: " + Integer.toBinaryString(num)); // 11111111
// 转八进制
System.out.println("八进制: " + Integer.toOctalString(num)); // 377
// 转十六进制
System.out.println("十六进制: " + Integer.toHexString(num)); // ff
// 转自定义进制(radix 2-36)
System.out.println("Base-5: " + Integer.toString(num, 5)); // 2010
// 格式化显示(带前缀)
System.out.println("0x: " + String.format("0x%X", num)); // 0xFF
System.out.println("0b: " + "0b" + Integer.toBinaryString(num)); // 0b11111111
}
}3. 位运算:bitCount 和前导/尾随零
java
public class BitOperations {
public static void main(String[] args) {
// bitCount:计算二进制中 1 的个数(汉明权重)
int n = 15; // 二进制 1111
System.out.println("bitCount(15): " + Integer.bitCount(15)); // 4
n = 16; // 二进制 10000
System.out.println("bitCount(16): " + Integer.bitCount(16)); // 1
// numberOfLeadingZeros:最高有效位之前的零个数
System.out.println("前导零(8): " + Integer.numberOfLeadingZeros(8)); // 28
System.out.println("前导零(16): " + Integer.numberOfLeadingZeros(16)); // 27
// numberOfTrailingZeros:最低有效位之后的零个数
System.out.println("尾随零(8): " + Integer.numberOfTrailingZeros(8)); // 3
System.out.println("尾随零(16): " + Integer.numberOfTrailingZeros(16)); // 4
// highestOneBit / lowestOneBit
System.out.println("最高位(24): " + Integer.highestOneBit(24)); // 16
System.out.println("最低位(24): " + Integer.lowestOneBit(24)); // 8
// rotateLeft / rotateRight:位旋转
int rotated = Integer.rotateLeft(0b1011, 2); // 1011 左旋 2 位 = 1110
System.out.println("rotateLeft(1011, 2): " + Integer.toBinaryString(rotated));
}
}4. 比较方法:compare vs max/min
java
public class CompareMethods {
public static void main(String[] args) {
// compare:返回 -1、0、1
System.out.println("compare(10, 20): " + Integer.compare(10, 20)); // -1
System.out.println("compare(20, 20): " + Integer.compare(20, 20)); // 0
System.out.println("compare(30, 20): " + Integer.compare(30, 20)); // 1
// max/min(JDK 8+)
System.out.println("max(10, 20): " + Integer.max(10, 20)); // 20
System.out.println("min(10, 20): " + Integer.min(10, 20)); // 10
// 与 == 的区别:能处理边界值
// Integer.MAX_VALUE == Integer.MAX_VALUE - 1 永远不会为 true
// 但 Integer.compare 能正确处理
int result = Integer.compare(Integer.MAX_VALUE, Integer.MAX_VALUE - 1);
System.out.println("MAX vs MAX-1: " + result); // 1
}
}Long 方法
Long 的方法和 Integer 类似,但处理 64 位数据。
java
public class LongMethods {
public static void main(String[] args) {
// 字符串解析
long l = Long.parseLong("123456789");
Long wrapper = Long.valueOf("123456789");
// 进制转换
System.out.println("Long 二进制: " + Long.toBinaryString(100));
System.out.println("Long 十六进制: " + Long.toHexString(100));
// 位运算(64 位版本)
System.out.println("Long bitCount: " + Long.bitCount(255L));
System.out.println("Long 前导零: " + Long.numberOfLeadingZeros(1L)); // 63
// 与 Integer 互转
int i = wrapper.intValue(); // 截断,可能丢失数据
long fromInt = Integer.MAX_VALUE; // int → long,无丢失
System.out.println("int to long: " + fromInt);
}
}Double 和 Float 方法
浮点数的坑比较多,先看方法。
java
public class FloatDoubleMethods {
public static void main(String[] args) {
// 字符串解析
double d = Double.parseDouble("3.14159");
Double wrapper = Double.valueOf("3.14159");
// 特殊值判断(必须用这些方法,不能用 ==)
System.out.println("NaN == NaN: " + (Double.NaN == Double.NaN)); // false ❌
System.out.println("isNaN(NaN): " + Double.isNaN(Double.NaN)); // true ✅
System.out.println("Infinite == Infinite: " + (Double.POSITIVE_INFINITY == Double.POSITIVE_INFINITY)); // true
System.out.println("isInfinite: " + Double.isInfinite(Double.POSITIVE_INFINITY)); // true
// 判断有限值
System.out.println("isFinite(1.0): " + Double.isFinite(1.0)); // true
System.out.println("isFinite(Infinity): " + Double.isFinite(Double.POSITIVE_INFINITY)); // false
// 转整数的特殊行为
System.out.println("NaN to int: " + (int)Double.parseDouble("NaN")); // 0
System.out.println("Infinity to int: " + (int)Double.parseDouble("Infinity")); // Integer.MAX_VALUE
System.out.println("-Infinity to int: " + (int)Double.parseDouble("-Infinity")); // Integer.MIN_VALUE
}
}Character 方法
Character 可能是最被低估的包装类。
java
public class CharacterMethods {
public static void main(String[] args) {
char c = 'A';
// 判断方法
System.out.println("isLetter(A): " + Character.isLetter(c)); // true
System.out.println("isDigit('5'): " + Character.isDigit('5')); // true
System.out.println("isLetterOrDigit('$'): " + Character.isLetterOrDigit('$')); // false
System.out.println("isWhitespace(' '): " + Character.isWhitespace(' ')); // true
System.out.println("isWhitespace('\\n'): " + Character.isWhitespace('\n')); // true
System.out.println("isUpperCase(A): " + Character.isUpperCase(c)); // true
System.out.println("isLowerCase('a'): " + Character.isLowerCase('a')); // true
// 转换方法
System.out.println("toUpperCase(a): " + Character.toUpperCase('a')); // 'A'
System.out.println("toLowerCase(A): " + Character.toLowerCase('A')); // 'a'
// Unicode 相关
System.out.println("charCount(A): " + Character.charCount('A')); // 1
System.out.println("charCount(中): " + Character.charCount('中')); // 1(Java 用 UTF-16)
// 补充平面字符需要两个 char(代理对)
System.out.println("charCount(𠀀): " + Character.charCount('𠀀')); // 2
// 代码点操作
int codePoint = Character.codePointAt("ABC中", 3); // '中' 的 Unicode
System.out.println("codePointAt(ABC中, 3): " + codePoint); // 20013
System.out.println("toChars(20013): " + new String(Character.toChars(20013))); // 中
}
}Boolean 方法
Boolean 简单但有用。
java
public class BooleanMethods {
public static void main(String[] args) {
// 字符串解析(注意:只有 "true" 会被解析为 true)
System.out.println("parseBoolean(\"true\"): " + Boolean.parseBoolean("true")); // true
System.out.println("parseBoolean(\"TRUE\"): " + Boolean.parseBoolean("TRUE")); // true
System.out.println("parseBoolean(\"yes\"): " + Boolean.parseBoolean("yes")); // false
// valueOf vs parseBoolean
Boolean b1 = Boolean.valueOf("true"); // 返回 Boolean.TRUE
Boolean b2 = Boolean.parseBoolean("true"); // 返回 true(自动装箱)
// toString
System.out.println("toString(true): " + Boolean.toString(true)); // "true"
System.out.println("toString(false): " + Boolean.toString(false)); // "false"
// 逻辑运算(JDK 16+)
System.out.println("logicalAnd(true, false): " + Boolean.logicalAnd(true, false)); // false
System.out.println("logicalOr(true, false): " + Boolean.logicalOr(true, false)); // true
System.out.println("logicalXor(true, true): " + Boolean.logicalXor(true, true)); // false
}
}方法对照表
| 方法 | Integer | Long | Double | 说明 |
|---|---|---|---|---|
parseXxx() | ✅ | ✅ | ✅ | 返回基本类型 |
valueOf() | ✅ | ✅ | ✅ | 返回包装类 |
toBinaryString() | ✅ | ✅ | ❌ | 转二进制字符串 |
toHexString() | ✅ | ✅ | ❌ | 转十六进制字符串 |
bitCount() | ✅ | ✅ | ❌ | 1 的个数 |
compare() | ✅ | ✅ | ✅ | 三值比较 |
max/min() | ✅ | ✅ | ❌ | 最大最小值 |
isNaN() | ❌ | ❌ | ✅ | 判断 NaN |
isInfinite() | ❌ | ❌ | ✅ | 判断无穷 |
要点回顾
parseInt()返回int,valueOf()返回Integer- 进制转换用
toBinaryString()、toHexString()、parseInt(str, radix) - 位运算方法(
bitCount、leadingZeros)在算法题中很有用 - Double/Float 的 NaN 判断必须用
isNaN(),不能用== - Character 不只是字符容器,还有强大的 Unicode 操作能力
技巧:看到「判断字符类型」的需求,第一反应应该是 Character 的 isXxx 方法,而不是自己写一堆 if-else。
