1. Java字符串操作基础与核心方法解析
字符串处理是Java编程中最基础也最频繁的操作之一。作为不可变对象,Java字符串通过String类提供了丰富的操作方法,理解这些方法的底层机制和适用场景对提升编码效率至关重要。
注意:所有字符串操作方法都不会修改原字符串,而是返回新字符串对象。这是Java字符串不可变特性决定的。
1.1 字符串创建与初始化
Java中最常见的三种字符串创建方式:
java复制// 方式1:字面量赋值(推荐)
String str1 = "Hello World";
// 方式2:new关键字实例化
String str2 = new String("Hello World");
// 方式3:字符数组转换
char[] charArray = {'H','e','l','l','o'};
String str3 = new String(charArray);
字面量方式会优先检查字符串常量池,而new方式会强制创建新对象。在循环或高频调用场景中,不当的创建方式会导致内存浪费:
java复制// 反例 - 每次循环都创建新对象
for(int i=0; i<10000; i++) {
String s = new String("test");
}
// 正例 - 利用常量池复用
for(int i=0; i<10000; i++) {
String s = "test";
}
1.2 字符串长度与空值判断
length()与isEmpty()是最基础的字符串检查方法:
java复制String str = "Java";
System.out.println(str.length()); // 输出4
System.out.println(str.isEmpty()); // 输出false
空字符串检查的常见误区:
java复制// 错误方式 - 无法检测null
if(str.length() == 0) {...}
// 正确方式 - 先判空再判长度
if(str == null || str.isEmpty()) {...}
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 字符串查找与比较操作
2.1 字符与子串查找
indexOf()系列方法用于定位字符或子串位置:
java复制String text = "Java编程指南";
// 查找字符
int pos1 = text.indexOf('编'); // 返回4
// 查找子串
int pos2 = text.indexOf("指南"); // 返回6
// 从指定位置查找
int pos3 = text.indexOf('a', 2); // 从索引2开始找'a'
技巧:
lastIndexOf()从字符串末尾开始查找,适合需要反向搜索的场景
2.2 字符串比较操作
字符串比较必须使用equals()而非==:
java复制String s1 = "Java";
String s2 = new String("Java");
System.out.println(s1 == s2); // false - 比较对象引用
System.out.println(s1.equals(s2)); // true - 比较内容
忽略大小写比较:
java复制String lang = "JAVA";
System.out.println(lang.equalsIgnoreCase("java")); // true
3. 字符串截取与分割
3.1 子串截取方法
substring()的两种用法:
java复制String str = "HelloWorld";
// 单参数:从beginIndex到末尾
String sub1 = str.substring(5); // "World"
// 双参数:前闭后开区间
String sub2 = str.substring(0,5); // "Hello"
常见坑点:endIndex不包含在结果中,且beginIndex必须小于endIndex
3.2 字符串分割
split()方法支持正则表达式分割:
java复制String data = "apple,orange,banana";
// 简单分割
String[] fruits = data.split(",");
// 限制分割次数
String[] limited = data.split(",", 2); // ["apple", "orange,banana"]
复杂分割案例:
java复制String log = "2023-08-20 14:30:00 [INFO] User login";
// 按空格分割,但保留引号内内容
String[] parts = log.split("\\s+(?=([^\"]*\"[^\"]*\")*[^\"]*$)");
4. 字符串修改与格式化
4.1 字符串拼接
三种主流拼接方式性能对比:
java复制// 1. +运算符(编译期优化)
String s1 = "A" + "B";
// 2. concat()方法
String s2 = "A".concat("B");
// 3. StringBuilder(大量拼接时最优)
StringBuilder sb = new StringBuilder();
sb.append("A").append("B");
String s3 = sb.toString();
实测:循环10000次拼接,StringBuilder比+快100倍以上
4.2 字符串格式化
String.format()支持各类格式化:
java复制// 数字格式化
String numStr = String.format("%,d", 1000000); // "1,000,000"
// 日期格式化
String dateStr = String.format("%tF", new Date()); // "2023-08-20"
// 多参数格式化
String msg = String.format("用户%s在%s登录", "admin", "14:30");
5. 字符串转换与编码处理
5.1 大小写转换
java复制String original = "Java Programming";
// 全转大写
String upper = original.toUpperCase();
// 全转小写
String lower = original.toLowerCase();
注意:土耳其等地区存在特殊的大小写规则,需指定Locale
5.2 字符编码转换
正确处理中文编码:
java复制String chinese = "中文";
// 错误方式 - 依赖平台默认编码
byte[] wrong = chinese.getBytes();
// 正确方式 - 明确指定编码
byte[] utf8 = chinese.getBytes(StandardCharsets.UTF_8);
byte[] gbk = chinese.getBytes("GBK");
6. 正则表达式与字符串匹配
6.1 基础匹配操作
java复制String email = "test@example.com";
// 简单匹配
boolean isEmail = email.matches("\\w+@\\w+\\.\\w+");
// 提取匹配内容
Pattern pattern = Pattern.compile("(\\d{3})-(\\d{4})");
Matcher matcher = pattern.matcher("tel: 010-1234");
if(matcher.find()) {
System.out.println(matcher.group(1)); // 010
}
6.2 常用正则模式
java复制// 手机号验证
String regex = "^1[3-9]\\d{9}$";
// 提取HTML标签内容
String htmlRegex = "<([a-z]+)>(.*?)</\\1>";
7. 性能优化与最佳实践
7.1 字符串常量池优化
通过intern()方法利用常量池:
java复制String s1 = new String("Java").intern();
String s2 = "Java";
System.out.println(s1 == s2); // true
7.2 StringBuilder使用场景
适合字符串高频修改的场景:
java复制StringBuilder sb = new StringBuilder(1024); // 预设容量
for(int i=0; i<100; i++) {
sb.append(i).append(",");
}
String result = sb.toString();
关键参数:初始容量设置应略大于预期大小,避免扩容开销
8. 常见问题排查与解决
8.1 内存溢出问题
OutOfMemoryError常见原因:
java复制// 错误示例 - 产生大量中间字符串
String result = "";
for(int i=0; i<100000; i++) {
result += i;
}
// 正确做法
StringBuilder sb = new StringBuilder();
for(int i=0; i<100000; i++) {
sb.append(i);
}
8.2 编码乱码问题
乱码排查步骤:
- 确认源文件编码(IDE设置)
- 检查IO操作是否指定编码
- 数据库连接添加characterEncoding参数
- 网页添加meta charset声明
9. Java 8+新增字符串操作
9.1 字符串拼接增强
String.join()简化集合拼接:
java复制List<String> list = Arrays.asList("A","B","C");
String joined = String.join(",", list); // "A,B,C"
9.2 空白字符处理
java复制String input = " Hello ";
// 去除首尾空白
String trimmed = input.trim();
// Java 11增强
String stripped = input.strip(); // 支持全角空格
10. 实战案例:字符串处理工具类
完整工具类示例:
java复制public class StringUtils {
/**
* 判断字符串是否为数字
*/
public static boolean isNumeric(String str) {
if(str == null || str.isEmpty()) {
return false;
}
return str.chars().allMatch(Character::isDigit);
}
/**
* 安全截取字符串
*/
public static String safeSubstring(String str, int maxLen) {
if(str == null) return "";
return str.length() > maxLen ? str.substring(0, maxLen) + "..." : str;
}
/**
* 统计字符出现次数
*/
public static int countChar(String str, char ch) {
return (int)str.chars().filter(c -> c == ch).count();
}
}
