Java字符串详解

这是一个 Java 快速入门项目,非常适合用来练手。相关源码已上传至 GitHub,👉 点击查看 GitHub 仓库。欢迎交流指正、提交 issue。

一、基本概念

Java 中的字符串由 java.lang.String 类表示,是不可变(immutable)对象。这意味着一旦创建,其内容就无法修改。任何看似"修改"的操作(如拼接、截取)都会创建新的 String 对象。

二、不可变性的意义

字符串的不可变性带来了以下核心优势:

  1. 字符串常量池的基础 --- 允许多个引用安全地共享同一对象
  2. 线程安全 --- 天然支持多线程并发访问
  3. 安全性 --- 关键信息(如数据库连接字符串)不会被意外篡改
  4. hashCode 缓存 --- 只需计算一次,提升哈希表等数据结构的性能

三、字符串的创建

Java 提供了两种主要的字符串创建方式:

1. 字面量方式(推荐)

java 复制代码
String s1 = "Hello";  // 使用字符串常量池

2. 构造方法方式

java 复制代码
String s2 = new String("Hello");  // 在堆中创建新对象

注意 :字面量方式会优先使用字符串常量池,而 new String() 每次都会创建新对象。

四、常用 API

以下是 String 类最常用的方法:

方法 说明 示例
length() 获取字符串长度 "Hello".length() → 5
charAt(int) 获取指定索引字符 "Hello".charAt(1) → 'e'
substring(int, int) 截取子串 "Hello".substring(1, 4) → "ell"
equals(Object) 比较内容是否相等 "Hi".equals("Hi") → true
indexOf(String) 查找子串首次出现位置 "Hello".indexOf("ll") → 2
trim() 去除首尾空白字符 " Hi ".trim() → "Hi"
toUpperCase() 转换为大写 "hello".toUpperCase() → "HELLO"
split(String) 按规则分割字符串 "a,b,c".split(",") → ["a","b","c"]

完整示例代码

以下是表格中所有方法的完整示例代码:

java 复制代码
public class StringApiExamples {
    public static void main(String[] args) {
        // 1. length() 方法示例
        String str1 = "Hello";
        int len = str1.length();
        System.out.println("字符串长度: " + len); // 输出: 5
        
        // 2. charAt(int) 方法示例
        String str2 = "Hello";
        char ch = str2.charAt(1);
        System.out.println("索引1的字符: " + ch); // 输出: e
        
        // 3. substring(int, int) 方法示例
        String str3 = "Hello World";
        String sub = str3.substring(6, 11);
        System.out.println("子串: " + sub); // 输出: World
        
        // 4. equals(Object) 方法示例
        String str4 = "Hello";
        String str5 = "Hello";
        boolean isEqual = str4.equals(str5);
        System.out.println("是否相等: " + isEqual); // 输出: true
        
        // 5. indexOf(String) 方法示例
        String str6 = "Hello World";
        int index = str6.indexOf("World");
        System.out.println("子串位置: " + index); // 输出: 6
        
        // 6. trim() 方法示例
        String str7 = "  Hello World  ";
        String trimmed = str7.trim();
        System.out.println("去除空白后: '" + trimmed + "'"); // 输出: 'Hello World'
        
        // 7. toUpperCase() 方法示例
        String str8 = "hello world";
        String upper = str8.toUpperCase();
        System.out.println("大写: " + upper); // 输出: HELLO WORLD
        
        // 8. split(String) 方法示例
        String str9 = "apple,banana,orange";
        String[] fruits = str9.split(",");
        for (String fruit : fruits) {
            System.out.println(fruit);
        }
        // 输出: apple
        //       banana
        //       orange
    }
}

性能优化建议

字符串拼接 :频繁拼接时,使用 StringBuilder(非线程安全)或 StringBuffer(线程安全),避免产生大量中间 String 对象。

java 复制代码
// 不推荐:产生多个中间对象
String result = "";
for (int i = 0; i < 100; i++) {
    result += i;  // 每次循环创建新 String
}

// 推荐:使用 StringBuilder
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 100; i++) {
    sb.append(i);
}
String result = sb.toString();
相关推荐
mCell33 分钟前
AI 时代,我为什么开始追求 100% 的测试覆盖率?
llm·ai编程·测试
ZzT1 小时前
AI-SDLC 实践 04|方案设计:把 Spec 转化为技术方案,并拆解为多 SubAgent 可执行的任务
ai编程·claude
文丑颜不良啊1 小时前
LeetCode2161~2180题目解析
java·leetcode
FRing031 小时前
vue2干货总结7(自定义指令、插槽、单页应用程序、路由的使用(VueRouter))
开发语言·前端·vue.js·vue2
文丑颜不良啊3 小时前
LeetCode2141~2160题目解析
java·leetcode
LabVIEW开发3 小时前
LabVIEW 连接板:28 个端子怎么排,优先级怎么定
java·算法·labview
天天被压力4 小时前
【A股分钟级高频数据完全手册 #07】北交所历史分钟K线接口:京市Pro版分时批量
java·人工智能·python
天天被压力4 小时前
【A股分钟级高频数据完全手册 #08】股票日、分时数据接口对比:普通分时与Pro版差异实测
java·人工智能·python
特立独行的猫A4 小时前
AI 时代,我为什么推荐用 cj-tauri 开发桌面应用
java·后端·python
金銀銅鐵4 小时前
从一个类名到一张类图:用反射自动生成 PlantUML
java·后端·uml