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(),地址比较用 ==
相关推荐
编程风暴17 分钟前
零基础数据分析项目模板+5条避坑红线
java·数据挖掘·数据分析
IKUN家族17 分钟前
常见的依懒
java·服务器·数据库
m0_5191964019 分钟前
【设计模式】java的习题
开发语言·python
我命由我1234529 分钟前
Jetpack Compose - Material Design 断点范围、WindowSizeClass、针对不同屏幕尺寸创建预览、四类导航栏
android·java·开发语言·java-ee·kotlin·android jetpack·android runtime
linux-hzh30 分钟前
百日算法修炼 · Day 05
java·算法
摇滚侠42 分钟前
云原生 Java 架构师的第一课 K8s+Docker+KubeSphere+DevOps 89-129
java·云原生·kubernetes
captain3761 小时前
多线程进阶
java·开发语言·数据库
思麟呀1 小时前
C++(八):文件系统库+并行算法
开发语言·c++
雨辰AI2 小时前
人大金仓 K8s 密评合规加固|国密全链路加密 + 权限收敛容器化落地(三级密评直通版)
java·云原生·容器·kubernetes·政务
郑州光合科技余经理7 小时前
代驾系统架构拆解:订单链路、权限组织与私有化源码交付
开发语言·后端·算法·架构·系统架构·uni-app·php