一、引言
在 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一旦创建,内容不能改!所有修改方法(如replace、substring)都会返回新字符串 ,原字符串不变。这就是为啥拼接大量字符串时,要用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 = "user@example.com";
// 简单验证:包含@和.,且.在@后面
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?
基础中的基础:String 是 Java 最常用类,考察你对字符串操作的熟悉度(比如会不会用 split、replace,知不知道不可变性)。
性能优化:比如拼接字符串用 StringBuilder 还是 String,这能看出你对内存和性能的理解。
源码理解 :深入的话,还会问 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,直接 "信手拈来"!