Java八:Character 类与string类

Character 类

java.lang.Characterchar 基本类型的包装类,它提供了一系列静态方法来操作和判断单个字符。

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(),地址比较用 ==
相关推荐
xexpertS1 小时前
队列积压治理:如何避免异步系统出现难以恢复的消息积压
java·开发语言
benchmark_cc8 小时前
如何用 Python + QuantDash 快速构建高胜率“配对交易(Pairs Trading)”策略?
开发语言·人工智能·python·pandas·量化交易·quantdash
阿维的博客日记9 小时前
MultipartFile 是不是表示仅仅是一个分片?
java·后端·spring·multipartfile
程序员无隅9 小时前
Coding Agent 为什么压缩上下文后还能继续工作?上下文模块设计拆解
java·开发语言·数据库
Python+999 小时前
Java 枚举类(Enum)详解:从基础到高级应用
java·开发语言·python
二炮手亮子10 小时前
浅记java线程池
java·开发语言
一路向北North10 小时前
Spring Security OAuth2.0(23):分布式系统授权-转发明文给微服务
java·spring·微服务
zmzb010310 小时前
C++课后习题训练记录Day157
开发语言·c++
dunge202610 小时前
2026年7月最新ChatGPT Plus / Pro 与 Codex:当 AI Agent 最新5.6版本来袭,必须理解事务、幂等与补偿
开发语言·人工智能·python
爱吃牛肉的大老虎12 小时前
rust基础之环境搭建
java·开发语言·rust