一、核心概念

Character 是 Java 中的包装类(Wrapper Class),位于 java.lang.Character 包中,用于封装基本数据类型 char 的值。

1.1 基本信息

属性 说明
类型 包装类(Wrapper)
所属包 java.lang.Character(无需导入)
继承 Object → Character
实现接口 Comparable<Character>, Serializable
封装类型 char(16位 Unicode 字符)
默认值(字段) null(引用类型)
char 默认值 \u0000(空字符)

1.2 自动装箱与拆箱

Character ch1 = 'A';      // 自动装箱
char ch2 = ch1;           // 自动拆箱

⚠️ 注意:null 的 Character 拆箱会抛出 NullPointerException


二、常用方法分类详解

2.1 判断字符类型(返回 boolean)

方法 说明
isLetter(char ch) 是否是字母(a-z, A-Z)
isDigit(char ch) 是否是数字(0-9)
isLetterOrDigit(char ch) 是否是字母或数字
isWhitespace(char ch) 是否是空白字符(空格、\t、\n 等)
isUpperCase(char ch) 是否是大写字母
isLowerCase(char ch) 是否是小写字母
isSpaceChar(char ch) 是否是 Unicode 空格字符
isISOControl(char ch) 是否是控制字符

✅ 示例代码:

System.out.println(Character.isDigit('5'));        // true
System.out.println(Character.isLetter('A'));       // true
System.out.println(Character.isWhitespace(' '));   // true
System.out.println(Character.isUpperCase('a'));    // false

2.2 转换大小写

方法 说明
toUpperCase(char ch) 转大写
toLowerCase(char ch) 转小写

✅ 示例代码:

System.out.println(Character.toUpperCase('a')); // A
System.out.println(Character.toLowerCase('B')); // b

🔁 支持国际化(如德语、土耳其语),但一般用 String.toUpperCase() 更安全。


2.3 字符与数值转换

方法 说明
charValue() 返回封装的 char 值(拆箱)
getNumericValue(char ch) 返回字符的数值(如 '5' → 5,'A' → 10)

✅ 示例代码:

Character ch = '7';
int num = Character.getNumericValue(ch); // 7
System.out.println(num); // 7

// 支持十六进制
System.out.println(Character.getNumericValue('A')); // 10

2.4 比较与哈希

方法 说明
compareTo(Character anotherChar) 比较两个字符(按 Unicode 值)
equals(Object obj) 判断是否相等

✅ 示例代码:

Character a = 'A';
Character b = 'B';

System.out.println(a.compareTo(b)); // -1
System.out.println(a.equals('A'));  // true

2.5 其他实用方法

方法 说明
isDefined(char ch) 是否是 Unicode 中定义的字符
isValidCodePoint(int codePoint) 是否是有效的 Unicode 码点
digit(char ch, int radix) 按指定进制返回数值(如 radix=16)

三、操作步骤(常见使用场景)

步骤 1:判断字符串是否全为数字

public static boolean isNumeric(String str) {
    if (str == null || str.isEmpty()) return false;
    for (char c : str.toCharArray()) {
        if (!Character.isDigit(c)) {
            return false;
        }
    }
    return true;
}

步骤 2:统计字符串中字母、数字个数

String text = "Hello123!";
int letters = 0, digits = 0;

for (char c : text.toCharArray()) {
    if (Character.isLetter(c)) letters++;
    else if (Character.isDigit(c)) digits++;
}

System.out.println("Letters: " + letters); // 5
System.out.println("Digits: " + digits);   // 3

步骤 3:首字母大写

public static String capitalize(String str) {
    if (str == null || str.isEmpty()) return str;
    char first = str.charAt(0);
    if (Character.isLowerCase(first)) {
        return Character.toUpperCase(first) + str.substring(1);
    }
    return str;
}

四、常见错误

错误 说明 修复方式
NullPointerException 对 null 的 Character 调用 charValue() 先判空或使用 Optional
误用 == 比较 Character 对象 可能因对象不同返回 false 使用 .equals()
认为 isWhitespace() 只识别空格 实际包括 \t, \n, \r 等 查阅文档或使用正则
混淆 char 与 String 'a' vs "a" 注意单引号与双引号

五、注意事项

  1. Character 是引用类型,可以为 null。
  2. 自动拆箱风险:null 拆箱会抛 NullPointerException。
  3. Unicode 支持:char 是 16 位,支持基本多文种平面(BMP),但对 emoji 等需用 int codePoint。
  4. 不可变性:Character 对象是不可变的,线程安全。
  5. 缓存机制:Character 缓存了 \u0000 到 \u007F(ASCII)的实例,提高性能。

六、使用技巧

✅ 技巧 1:安全拆箱

Character ch = getChar(); // 可能 null
char c = ch != null ? ch : '\u0000';

✅ 技巧 2:结合 Stream 处理字符

String str = "abc123";

long digitCount = str.chars()
                     .mapToObj(c -> (char) c)
                     .filter(Character::isDigit)
                     .count();

✅ 技巧 3:判断是否为 Emoji(部分支持)

// 简单判断是否为非基本字符
int codePoint = str.codePointAt(0);
if (codePoint > 0xFFFF) {
    System.out.println("可能是 Emoji 或补充字符");
}

七、最佳实践

实践 说明
✅ 优先使用 char 而非 Character 除非需要 null 或集合存储
✅ 使用 Character.isXxx() 判断类型 比正则或手动判断更高效
✅ 在循环中避免频繁装箱 使用 char[] 或 String.charAt()
✅ 处理国际化时注意大小写规则 特殊语言(如土耳其语)需用 Locale
✅ 使用 String 方法替代单字符操作 如 str.toUpperCase() 比逐字符转换更安全

八、性能优化

  1. Character.isXxx() 方法性能极高,内联优化好。
  2. 避免在高频循环中创建 Character 对象:
    // 慢
    for (char c : str.toCharArray()) {
        Character ch = c; // 装箱
    }
    
    // 快
    for (int i = 0; i < str.length(); i++) {
        char c = str.charAt(i); // 直接使用 char
    }
    
  3. 使用缓存的常量:Character.valueOf('A') 会复用对象。

九、总结:Character 使用口诀

🔑 “判类用 isXxx,转大小写 toXxx,拆箱防 null,循环避装箱”

✅ 核心要点回顾:

类别 推荐方法
判断类型 isLetter, isDigit, isWhitespace
转换 toUpperCase, toLowerCase
比较 equals, compareTo
安全使用 判空、避免 null 拆箱
性能 优先使用 char,避免循环装箱