Character 类
java.lang.Character 是 char 基本类型的包装类,它提供了一系列静态方法来操作和判断单个字符。
Character 类:是 char 基本类型的包装类,用于处理单个字符。String 类:是一个不可变的字符序列,用于处理一串字符(字符串)。
小伙伴们不清楚什么是包装类什么是基础类,可以看看我的文章java基础八:基础类与包装类
java
// 自动装箱:char → Character
Character ch1 = 'A';
// 手动装箱(旧方式)
Character ch2 = Character.valueOf('B');
// 拆箱:Character → char
char c = ch1; // 自动拆箱
常用静态方法(非常实用)
Character 类提供了大量用于判断字符类型 和转换大小写的静态方法:
| 方法 | 描述 | 示例 |
|---|---|---|
isDigit(char ch) |
判断是否为数字 | Character.isDigit('5') → true |
isLetter(char ch) |
判断是否为字母 | Character.isLetter('A') → true |
isLetterOrDigit(char ch) |
判断是否为字母或数字 | Character.isLetterOrDigit('a') → true |
isWhitespace(char ch) |
判断是否为空白字符(空格、制表符等) | Character.isWhitespace(' ') → true |
isUpperCase(char ch) |
判断是否为大写字母 | Character.isUpperCase('A') → true |
isLowerCase(char ch) |
判断是否为小写字母 | Character.isLowerCase('a') → true |
toUpperCase(char ch) |
转换为大写 | Character.toUpperCase('a') → 'A' |
toLowerCase(char ch) |
转换为小写 | Character.toLowerCase('A') → 'a' |
isSpaceChar(char ch) |
判断是否为 Unicode 空格字符 |
典型使用场景
场景一:验证用户输入的密码强度
java
public static boolean isValidPassword(String password) {
boolean hasDigit = false;
boolean hasLetter = false;
for (int i = 0; i < password.length(); i++) {
char c = password.charAt(i);
if (Character.isDigit(c)) {
hasDigit = true;
} else if (Character.isLetter(c)) {
hasLetter = true;
} else {
return false; // 包含非法字符
}
}
return hasDigit && hasLetter;
}
场景二:统计字符串中字母、数字、空格的个数
java
public static void countChars(String str) {
int letterCount = 0, digitCount = 0, spaceCount = 0;
for (char c : str.toCharArray()) {
if (Character.isLetter(c)) {
letterCount++;
} else if (Character.isDigit(c)) {
digitCount++;
} else if (Character.isWhitespace(c)) {
spaceCount++;
}
}
System.out.println("字母: " + letterCount);
System.out.println("数字: " + digitCount);
System.out.println("空格: " + spaceCount);
}
String 类
java.lang.String 是 Java 中最常用的类之一,它代表一个不可变的字符序列。一旦创建,内容就不能改变。
1. 创建字符串的两种方式
java
// 方式一:字面量(推荐,会放入字符串常量池)
String s1 = "Hello";
// 方式二:new 关键字(强制创建新对象,不推荐)
String s2 = new String("Hello");
// 两者区别:s1 指向常量池中的对象,s2 指向堆内存中的新对象
System.out.println(s1 == s2); // false(地址不同)
System.out.println(s1.equals(s2)); // true(内容相同)
2. String 的不可变性(重要特性)
一旦创建,字符串内容无法修改。任何"修改"操作都会创建新的字符串对象。
java
String s = "Hello";
s = s + " World"; // 实际上创建了一个新字符串 "Hello World",原来的 "Hello" 被丢弃
// 内存示意图:
// 原始: s → "Hello"(常量池)
// 操作后: s → "Hello World"(新对象),"Hello" 变为垃圾等待回收
3. 常用方法(按功能分类)
① 判断类方法
| 方法 | 描述 | 示例 |
|---|---|---|
length() |
返回字符串长度 | "Hello".length() → 5 |
isEmpty() |
判断是否为空字符串 | "".isEmpty() → true |
isBlank() (Java 11+) |
判断是否为空白(空格、空串) | " ".isBlank() → true |
equals(Object obj) |
比较内容是否相等 | "abc".equals("abc") → true |
equalsIgnoreCase(String) |
忽略大小写比较 | "ABC".equalsIgnoreCase("abc") → true |
startsWith(String prefix) |
判断是否以某前缀开头 | "Hello".startsWith("He") → true |
endsWith(String suffix) |
判断是否以某后缀结尾 | "Hello".endsWith("lo") → true |
contains(CharSequence s) |
判断是否包含子串 | "Hello".contains("ell") → true |
② 获取类方法
| 方法 | 描述 | 示例 |
|---|---|---|
charAt(int index) |
获取指定位置的字符 | "Hello".charAt(1) → 'e' |
indexOf(String str) |
返回子串首次出现的位置 | "Hello".indexOf("l") → 2 |
lastIndexOf(String str) |
返回子串最后一次出现的位置 | "Hello".lastIndexOf("l") → 3 |
substring(int beginIndex) |
截取子串(从beginIndex到末尾) | "Hello".substring(2) → "llo" |
substring(int begin, int end) |
截取子串([begin, end)) | "Hello".substring(1, 4) → "ell" |
③ 转换类方法
| 方法 | 描述 | 示例 |
|---|---|---|
toUpperCase() |
转换为大写 | "Hello".toUpperCase() → "HELLO" |
toLowerCase() |
转换为小写 | "Hello".toLowerCase() → "hello" |
trim() |
去除首尾空白 | " Hi ".trim() → "Hi" |
strip() (Java 11+) |
去除首尾空白(支持Unicode) | " Hi ".strip() → "Hi" |
replace(char old, char new) |
替换所有字符 | "Hello".replace('l', 'w') → "Hewwo" |
replaceAll(String regex, String replacement) |
使用正则替换 | "a1b2c3".replaceAll("\\d", "") → "abc" |
split(String regex) |
按正则分割成数组 | "a,b,c".split(",") → ["a","b","c"] |
toCharArray() |
转换为字符数组 | "Hi".toCharArray() → ['H','i'] |
④ 其他实用方法
| 方法 | 描述 | 示例 |
|---|---|---|
concat(String str) |
拼接字符串 | "Hello".concat(" World") → "Hello World" |
join(CharSequence delimiter, CharSequence... elements) (静态) |
用分隔符连接多个字符串 | String.join("-", "a","b","c") → "a-b-c" |
repeat(int count) (Java 11+) |
重复字符串n次 | "Hi".repeat(3) → "HiHiHi" |
indent(int n) (Java 12+) |
调整缩进 | |
lines() (Java 11+) |
按行分割成Stream |
Character vs String 核心区别
| 特性 | Character | String |
|---|---|---|
| 作用 | 处理单个字符 | 处理字符串(字符序列) |
| 类型 | char 的包装类 |
独立的类 |
| 不可变性 | 包装对象不可变,但 char 基本类型可变 |
完全不可变 |
| 存储内容 | 一个字符 | 多个字符(char数组) |
| 常用操作 | 判断字符类型、大小写转换 | 截取、查找、替换、分割 |
| 内存 | 较小(16位 + 对象头) | 较大(字符数组 + 对象头) |
| 比较方式 | 基本类型用 ==,包装类用 equals() |
内容比较用 equals(),地址比较用 == |