Skip to content

包装类常用方法

你有没有被 parseIntvalueOf 搞混过?

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("解析失败: 不是有效数字");
        }
    }
}

实战选择

  • 需要 intparseInt()
  • 需要 IntegervalueOf()
  • 需要进制转换 → 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
    }
}

方法对照表

方法IntegerLongDouble说明
parseXxx()返回基本类型
valueOf()返回包装类
toBinaryString()转二进制字符串
toHexString()转十六进制字符串
bitCount()1 的个数
compare()三值比较
max/min()最大最小值
isNaN()判断 NaN
isInfinite()判断无穷

要点回顾

  • parseInt() 返回 intvalueOf() 返回 Integer
  • 进制转换用 toBinaryString()toHexString()parseInt(str, radix)
  • 位运算方法(bitCountleadingZeros)在算法题中很有用
  • Double/Float 的 NaN 判断必须用 isNaN(),不能用 ==
  • Character 不只是字符容器,还有强大的 Unicode 操作能力

技巧:看到「判断字符类型」的需求,第一反应应该是 Character 的 isXxx 方法,而不是自己写一堆 if-else。

基于 VitePress 构建