一、核心概念

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

1.1 基本信息

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

1.2 自动装箱与拆箱

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

⚠️ 注意:nullCharacter 拆箱会抛出 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 nullCharacter 调用 charValue() 先判空或使用 Optional
误用 == 比较 Character 对象 可能因对象不同返回 false 使用 .equals()
认为 isWhitespace() 只识别空格 实际包括 \t, \n, \r 查阅文档或使用正则
混淆 charString '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,避免循环装箱