Java——String

在 Java 中,String 类是用于表示不可变字符序列的核心类,提供了丰富的 API 用于操作字符串。以下是 String 类的关键特性和常用方法详解:


一、String 的核心特性

  1. 不可变性(Immutable)

    • 一旦创建,字符串内容不可修改。所有修改操作(如拼接、替换)都会生成新字符串。

    • 优势:线程安全、缓存哈希值、复用字符串常量池。

    • 示例:

      java 复制代码
      String s1 = "Hello";
      String s2 = s1.concat(" World"); // s1 不变,s2 是新对象 "Hello World"
  2. 字符串常量池(String Pool)

    • 直接使用双引号创建的字符串会被存入常量池,重复的字符串字面量会复用对象。

    • new String("...") 会强制在堆中创建新对象,即使内容相同。

    • 示例:

      java 复制代码
      String a = "Java";      // 常量池中的对象
      String b = "Java";      // 复用常量池的对象(a == b 为 true)
      String c = new String("Java"); // 堆中新对象(a == c 为 false)

二、String 的构造方法

构造方法 描述
String() 创建空字符串对象
String(String original) 基于现有字符串创建新对象(内容相同,但对象不同)
String(char[] value) 通过字符数组创建字符串
String(byte[] bytes, Charset charset) 通过字节数组和指定编码创建字符串
String(StringBuffer buffer) 通过 StringBuffer 创建字符串
String(StringBuilder builder) 通过 StringBuilder 创建字符串
示例:
java 复制代码
char[] chars = {'H', 'e', 'l', 'l', 'o'};
String s1 = new String(chars); // "Hello"

byte[] bytes = {72, 101, 108, 108, 111};
String s2 = new String(bytes, StandardCharsets.UTF_8); // "Hello"

三、String 的常用 API

1. 字符串基本信息
方法 描述 示例
int length() 返回字符串长度 "Java".length() → 4
boolean isEmpty() 判断字符串是否为空(长度为0) "".isEmpty() → true
boolean isBlank() 判断字符串是否全为空白(Java 11+) " ".isBlank() → true

2. 字符串操作
方法 描述 示例
String concat(String str) 拼接字符串,返回新字符串 "Hello".concat("!") → "Hello!"
String substring(int beginIndex) 截取从 beginIndex 到末尾的子串 "Java".substring(1) → "ava"
String substring(int begin, int end) 截取 [begin, end) 的子串 "Java".substring(1, 3) → "av"
String replace(char old, char new) 替换所有匹配字符 "Java".replace('a', 'o') → "Jovo"
String replaceAll(String regex, String replacement) 使用正则替换所有匹配的子串 "a1b2".replaceAll("\\d", "-") → "a-b-"
String[] split(String regex) 按正则分割字符串为数组 "a,b,c".split(",") → "a", "b", "c"
String toLowerCase() 转为小写 "JAVA".toLowerCase() → "java"
String toUpperCase() 转为大写 "java".toUpperCase() → "JAVA"
String trim() 去除首尾空白符(ASCII空格、制表符等) " Java ".trim() → "Java"
String strip() 去除首尾空白符(支持全角空格,Java 11+) " Java ".strip() → "Java"

3. 字符串比较
方法 描述 示例
boolean equals(Object obj) 比较内容是否相等(区分大小写) "Java".equals("java") → false
boolean equalsIgnoreCase(String str) 比较内容是否相等(不区分大小写) "Java".equalsIgnoreCase("JAVA") → true
int compareTo(String str) 按字典序比较大小(返回负数、0、正数) "a".compareTo("b") → -1
int compareToIgnoreCase(String str) 按字典序比较大小(忽略大小写) "A".compareToIgnoreCase("a") → 0

4. 字符串查找
方法 描述 示例
boolean contains(CharSequence s) 是否包含指定子串 "Java".contains("av") → true
int indexOf(int ch) 返回字符首次出现的索引(未找到返回-1) "Java".indexOf('a') → 1
int indexOf(String str) 返回子串首次出现的索引 "Java".indexOf("va") → 2
int lastIndexOf(int ch) 返回字符最后一次出现的索引 "Java".lastIndexOf('a') → 3
boolean startsWith(String prefix) 是否以指定前缀开头 "Java".startsWith("Ja") → true
boolean endsWith(String suffix) 是否以指定后缀结尾 "Java".endsWith("va") → false

5. 类型转换
方法 描述 示例
char[] toCharArray() 转为字符数组 "Java".toCharArray() → 'J','a','v','a'
byte[] getBytes() 转为默认编码的字节数组 "Java".getBytes() → 74, 97, 118, 97
byte[] getBytes(Charset charset) 转为指定编码的字节数组 "Java".getBytes(StandardCharsets.UTF_8)
static String valueOf(Object obj) 将对象转为字符串(调用 obj.toString()) String.valueOf(123) → "123"

四、注意事项

  1. 字符串比较必须用 equals,而非 ==

    java 复制代码
    String s1 = new String("Java");
    String s2 = new String("Java");
    System.out.println(s1 == s2);        // false(比较对象地址)
    System.out.println(s1.equals(s2));   // true(比较内容)
  2. 避免频繁拼接字符串

    使用 + 或 concat 拼接字符串会生成大量中间对象,应改用 StringBuilder:

    java 复制代码
    StringBuilder sb = new StringBuilder();
    sb.append("Hello").append(" ").append("World");
    String result = sb.toString(); // "Hello World"
  3. 处理空指针(Null Safety)

    在调用字符串方法前检查是否为 null:

    java 复制代码
    String str = null;
    if (str != null && !str.isEmpty()) {
        // 安全操作
    }

五、示例代码

java 复制代码
public class StringDemo {
    public static void main(String[] args) {
        String s = " Hello, Java! ";

        // 基本操作
        System.out.println(s.trim());              // "Hello, Java!"
        System.out.println(s.substring(7));        // "Java! "
        System.out.println(s.replace("Java", "World")); // " Hello, World! "

        // 比较
        System.out.println("java".equalsIgnoreCase("JAVA")); // true

        // 分割与拼接
        String[] parts = "a,b,c".split(",");
        String joined = String.join("-", parts);  // "a-b-c"
        System.out.println(joined);
    }
}

六、Java 11+ 新增方法

方法 描述 示例
String repeat(int n) 重复字符串 n 次 "a".repeat(3) → "aaa"
String stripLeading() 去除头部空白符(支持全角空格) " Java".stripLeading() → "Java"
String stripTrailing() 去除尾部空白符(支持全角空格) "Java ".stripTrailing() → "Java"
boolean isBlank() 判断是否全为空白符(包括全角空格) "  ".isBlank() → true

掌握这些 API 能高效处理字符串操作,注意合理选择方法以优化性能!

相关推荐
可涵不会debug10 分钟前
C++ std::bind 实战教程:线程池、回调场景全覆盖
linux·开发语言·c++
不正经的码狗13 分钟前
Java 开发环境搭建与 Eclipse 使用速通教程
java·开发语言·eclipse
用户81818706274614 分钟前
第37章 Java应用在K8s里的经典坑:容器内存/CPU limit与JVM参数不匹配导致的OOMKilled
java·后端
小小张说故事21 分钟前
pandas 读大 CSV 太慢?6 个实测提速技巧(dtype / 分块 / 引擎选择)
后端·python·pandas
yi01124 分钟前
DAY17: LeetCode 139|单词拆分:从“把单词删掉”到用 DP 记录合法切口
人工智能·笔记·python·算法·leetcode·动态规划
马剑威(威哥爱编程)27 分钟前
【AI全栈后端12-03】Spring Boot 用多模型路由把智能客服成本降下来
java·人工智能·spring boot
阿钱真强道28 分钟前
24 嵌入式操作系统 | 项目启动与环境准备(PyQt5 / Flask 两个“最小可跑“)
开发语言·qt·flask·架构设计·协议契约
Java的搬运工28 分钟前
【无标题】
python·机器学习·docker·fastapi·模型部署·mlops·ai工程化
霸道流氓气质31 分钟前
AI模型幻觉检测与抑制完全指南:从规则引擎到RAG对比的Java生产级实战
java·开发语言·人工智能
前端 贾公子35 分钟前
LangChain核心组件 == 提示词(Prompts)
开发语言·c#