Java八:Character 类与string类

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(),地址比较用 ==
相关推荐
MandalaO_O10 分钟前
IDEA 开发(快捷键 + 调试 + 序列化)
java·ide·intellij-idea
xiaoqiMikko1 小时前
JVM 线上排查实战(七):jps 看不见它、jstack 连不上它,可它明明活得好好的
java·jvm
狼爷2 小时前
Rust/Go/Java/Python/PHP 大比拼:负载下后端框架到底差多少?
java·后端·编程语言
念何架构之路2 小时前
zap扩展生态与总结
java·前端·数据库
第七页独白3 小时前
汽车零件厂如何通过 QMS 真正落地 IATF 16949——QMS软件系统:品质检验-内审稽核-8d客诉管理:全星质量管理软件系统
java·前端·数据库
QCoding3 小时前
Spring AI Alibaba Graph实战:从ReAct Agent到Workflow,企业AI复杂流程该如何编排?
java·人工智能
用户094248568033 小时前
第25章:Java虚拟线程(Project Loom)实战与调度协作
java·jvm
砚底藏山河3 小时前
量化实战:截面因子有效性检验(IC 分析与分层回测)
java·python·金融·maven
wuminyu3 小时前
ForkJoinPool内部WorkQueue的Lock-Free数组操作以及并发任务窃取原理剖析
java·linux·c语言·jvm·c++
Elastic 中国社区官方博客3 小时前
使用 Lucene 搜索你的 Bean — 索引
java·大数据·数据库·elasticsearch·搜索引擎·全文检索·lucene