今天聊聊Java 中 String 的常见方法

一、引言

在 Java 世界里,String类就像一个万能工具箱,几乎每个项目都会用到它。从简单的字符串拼接,到复杂的文本处理,String提供的方法能解决大部分字符串操作需求。本文将用大白话 + 代码示例,带你玩转String的常用方法,让你在开发中 "字符串操作不踩坑"。

二、基础操作:字符串的 "生老病死"

1. 创建字符串(两种姿势)

  • 直接赋值(常量池优化)

    ini 复制代码
    String str = "Hello"; // 优先从常量池拿,节省内存
  • new 关键字(每次新建对象)

    javascript 复制代码
    String str = new String("Hello"); // 不管有没有,都new一个,慎用!

2. 长度与比较(知己知彼)

  • length() :看字符串有多长(像量身高)。

    go 复制代码
    int len = "abc".length(); // 3
  • equals() vs ==

    • equals()比内容(比如 "张三" 和 "张三" 相等)。

    • ==比内存地址(new 出来的即使内容一样,地址不同,==就不等)。
      代码示例

    ini 复制代码
    String a = "张三", b = new String("张三");
    System.out.println(a.equals(b)); // true(内容一样)
    System.out.println(a == b); // false(地址不同)

3. 查找与截取(找 substring )

  • indexOf() :找子串第一次出现的位置(像找单词在句子中的位置)。

    ini 复制代码
    int pos = "HelloWorld".indexOf("llo"); // 2(从0开始数)
  • substring() :截段子串(比如从第 3 个字符开始截)。

    perl 复制代码
    String sub = "HelloWorld".substring(3); // "loWorld"
    String sub2 = "HelloWorld".substring(3, 5); // "lo"(左闭右开,不包含第5位)

三、进阶操作:替换、分割、转换

1. 替换(改内容)

  • replace() :把所有 "旧内容" 换成 "新内容"(比如把 "哈" 换成 "呵")。

    ini 复制代码
    String newStr = "哈哈哈".replace("哈", "呵"); // "呵呵呵"
  • replaceFirst() :只换第一个(比如句子里第一个 "错误" 换成 "正确")。

    ini 复制代码
    String str = "错误错误错误";
    String fixed = str.replaceFirst("错误", "正确"); // "正确错误错误"

2. 分割(拆成数组)

  • split() :按分隔符拆字符串(比如按逗号拆 CSV 数据)。

    css 复制代码
    String[] parts = "a,b,c".split(","); // 得到 ["a","b","c"]

3. 大小写转换(变模样)

  • toUpperCase() :全大写(比如 "hello"→"HELLO")。

  • toLowerCase() :全小写(比如 "WORLD"→"world")。

    ini 复制代码
    String upper = "hello".toUpperCase(); // "HELLO"
    String lower = "WORLD".toLowerCase(); // "world"

4. 去空格(整理仪容)

  • trim() :去掉前后空格(比如用户输入的 "姓名"→"姓名")。

    ini 复制代码
    String trimmed = "  Java  ".trim(); // "Java"

四、特殊操作:不可变性与性能优化

1. 不可变性(String 的 "脾气")

String一旦创建,内容不能改!所有修改方法(如replacesubstring)都会返回新字符串 ,原字符串不变。这就是为啥拼接大量字符串时,要用StringBuilder(可变,省内存):

ini 复制代码
// 反面教材:每次+都会new新String,慢!
String s = "";
for (int i=0; i<1000; i++) {
    s += i; // 性能差!
}

// 正面教材:用StringBuilder,一次到位
StringBuilder sb = new StringBuilder();
for (int i=0; i<1000; i++) {
    sb.append(i); // 快!
}
String result = sb.toString();

2. 常用工具方法(偷懒必备)

  • valueOf() :把任何东西转成字符串(比如数字 123→"123",null→"null")。

    javascript 复制代码
    String numStr = String.valueOf(123); // "123"
    String nullStr = String.valueOf(null); // "null"(注意:传null时会返回"null"字符串)
  • isEmpty() vs isBlank()(Java 11+)

    • isEmpty():看是不是空字符串(长度 0,比如""→true)。

    • isBlank():看是不是空白(长度 0 或全是空格,比如" "→true)。

    csharp 复制代码
    System.out.println("".isEmpty()); // true
    System.out.println("  ".isBlank()); // true(Java 11及以上可用)

五、实际场景:这些方法怎么用?

1. 验证用户输入(比如邮箱)

less 复制代码
String email = "[email protected]";
// 简单验证:包含@和.,且.在@后面
if (email.contains("@") && email.indexOf(".") > email.indexOf("@")) {
    System.out.println("邮箱格式对了!");
}

2. 日志解析(提取关键信息)

ini 复制代码
String log = "User [id=123, name=Tom] logged in";
// 提取用户ID
int start = log.indexOf("id=") + 3; // 找到"id="后面的位置
int end = log.indexOf(",", start); // 找第一个逗号的位置
String userId = log.substring(start, end); // "123"
System.out.println("用户ID:" + userId);

3. 处理 CSV 数据(分割行和列)

ini 复制代码
String csvLine = "Alice,25,New York";
String[] columns = csvLine.split(",");
for (String col : columns) {
    System.out.println(col); // 依次输出Alice、25、New York
}

六、面试官为啥总问 String?

  1. 基础中的基础:String 是 Java 最常用类,考察你对字符串操作的熟悉度(比如会不会用 split、replace,知不知道不可变性)。
  2. 性能优化:比如拼接字符串用 StringBuilder 还是 String,这能看出你对内存和性能的理解。
  3. 源码理解 :深入的话,还会问 String 的常量池、hashCode 计算(每个字符的 ASCII 乘 31 累加,比如 "abc" 的 hash 是 9731²+9831+99),这些是底层原理,体现基本功。

七、总结:String 方法速查表

方法 作用 示例
length() 长度 "abc".length() → 3
equals() 内容比较 "a".equals("a") → true
indexOf() 找子串位置 "Hello".indexOf("ll") → 2
substring() 截段子串 "Hello".substring(1,3) → "el"
replace() 替换内容 "abc".replace("a","x") → "xbc"
split() 分割字符串 "a,b".split(",") → ["a","b"]
toUpperCase() 转大写 "hello".toUpperCase() → "HELLO"
trim() 去前后空格 " abc ".trim() → "abc"

掌握这些方法,字符串操作就像搭积木一样简单。下次写代码遇到字符串处理,不用再查 API,直接 "信手拈来"!

相关推荐
恸流失13 分钟前
DJango项目
后端·python·django
硅的褶皱1 小时前
对比分析LinkedBlockingQueue和SynchronousQueue
java·并发编程
MoFe11 小时前
【.net core】天地图坐标转换为高德地图坐标(WGS84 坐标转 GCJ02 坐标)
java·前端·.netcore
季鸢2 小时前
Java设计模式之观察者模式详解
java·观察者模式·设计模式
Fanxt_Ja2 小时前
【JVM】三色标记法原理
java·开发语言·jvm·算法
Mr Aokey3 小时前
Spring MVC参数绑定终极手册:单&多参/对象/集合/JSON/文件上传精讲
java·后端·spring
小马爱记录3 小时前
sentinel规则持久化
java·spring cloud·sentinel
地藏Kelvin3 小时前
Spring Ai 从Demo到搭建套壳项目(二)实现deepseek+MCP client让高德生成昆明游玩4天攻略
人工智能·spring boot·后端
菠萝014 小时前
共识算法Raft系列(1)——什么是Raft?
c++·后端·算法·区块链·共识算法
长勺4 小时前
Spring中@Primary注解的作用与使用
java·后端·spring