字符串处理常用写法
字符串处理是编程中最常用的操作之一。本文详细介绍字符串处理的常用方法和最佳实践,包含大量实用示例。
📋 目录
🎯 一、字符串拼接
1.1 基本拼接
使用+号拼接:
java
// 简单拼接
String str1 = "Hello" + " " + "World"; // "Hello World"
// 拼接变量
String name = "张三";
String greeting = "你好," + name; // "你好,张三"
// 拼接数字
int age = 25;
String info = "年龄:" + age; // "年龄:25"
// 多次拼接(性能较差,不推荐)
String result = "";
for (int i = 0; i < 10; i++) {
result += i; // 每次都会创建新对象
}使用StringBuilder:
java
// 单线程环境推荐使用StringBuilder
StringBuilder sb = new StringBuilder();
sb.append("Hello");
sb.append(" ");
sb.append("World");
String result = sb.toString(); // "Hello World"
// 链式调用
StringBuilder sb2 = new StringBuilder()
.append("Hello")
.append(" ")
.append("World");
// 指定初始容量(性能优化)
StringBuilder sb3 = new StringBuilder(100);
// 插入字符串
sb.insert(5, ","); // 在索引5位置插入","
// 删除字符
sb.delete(5, 7); // 删除索引5到7的字符
// 反转字符串
sb.reverse();使用StringBuffer:
java
// 多线程环境使用StringBuffer(线程安全)
StringBuffer sb = new StringBuffer();
sb.append("Hello");
sb.append(" ");
sb.append("World");
String result = sb.toString();1.2 Java 8+拼接方式
String.join:
java
// 使用分隔符连接字符串数组
String[] arr = {"a", "b", "c"};
String result = String.join(",", arr); // "a,b,c"
// 连接List
List<String> list = Arrays.asList("a", "b", "c");
String result2 = String.join("-", list); // "a-b-c"
// 连接多个字符串
String result3 = String.join(" ", "Hello", "World"); // "Hello World"StringJoiner:
java
// 使用StringJoiner
StringJoiner sj = new StringJoiner(",");
sj.add("a");
sj.add("b");
sj.add("c");
String result = sj.toString(); // "a,b,c"
// 带前缀和后缀
StringJoiner sj2 = new StringJoiner(",", "[", "]");
sj2.add("a");
sj2.add("b");
String result2 = sj2.toString(); // "[a,b]"
// 空值处理
StringJoiner sj3 = new StringJoiner(",").setEmptyValue("empty");
String result3 = sj3.toString(); // "empty"Stream拼接:
java
// 使用Stream拼接
List<String> list = Arrays.asList("a", "b", "c");
String result = list.stream()
.collect(Collectors.joining(",")); // "a,b,c"
// 带前缀和后缀
String result2 = list.stream()
.collect(Collectors.joining(",", "[", "]")); // "[a,b,c]"
// 过滤后拼接
String result3 = list.stream()
.filter(s -> s.length() > 1)
.collect(Collectors.joining(","));🎯 二、字符串分割
2.1 split方法
基本分割:
java
// 按单个字符分割
String str = "a,b,c,d";
String[] parts = str.split(",");
// 结果:["a", "b", "c", "d"]
// 按多个字符分割
String str2 = "a;b;c;d";
String[] parts2 = str2.split(";");
// 限制分割次数
String str3 = "a,b,c,d,e";
String[] parts3 = str3.split(",", 3);
// 结果:["a", "b", "c,d,e"]
// 正则表达式分割
String str4 = "a b c d";
String[] parts4 = str4.split("\\s+"); // 按空白字符分割
// 结果:["a", "b", "c", "d"]特殊情况处理:
java
// 处理前后空白
String str = " a , b , c ";
String[] parts = str.split(",");
// 结果:[" a ", " b ", " c "]
// 分割后去除空白
String[] trimmed = Arrays.stream(str.split(","))
.map(String::trim)
.toArray(String[]::new);
// 结果:["a", "b", "c"]
// 过滤空字符串
String str2 = "a,,b,,c";
String[] filtered = Arrays.stream(str2.split(","))
.filter(s -> !s.isEmpty())
.toArray(String[]::new);
// 结果:["a", "b", "c"]2.2 使用Pattern分割
java
// 使用Pattern分割
Pattern pattern = Pattern.compile(",");
String str = "a,b,c,d";
String[] parts = pattern.split(str);
// 限制分割次数
String[] parts2 = pattern.split(str, 2);2.3 StringTokenizer(已过时,不推荐)
java
// StringTokenizer使用(仅作了解,不推荐使用)
StringTokenizer tokenizer = new StringTokenizer("a,b,c", ",");
while (tokenizer.hasMoreTokens()) {
String token = tokenizer.nextToken();
System.out.println(token);
}🎯 三、字符串格式化
3.1 String.format
基本格式化:
java
// 格式化字符串
String formatted = String.format("姓名:%s,年龄:%d", "张三", 25);
// 结果:"姓名:张三,年龄:25"
// 格式化数字
String num1 = String.format("%d", 123); // "123"
String num2 = String.format("%05d", 123); // "00123"
String num3 = String.format("%.2f", 3.14159); // "3.14"
String num4 = String.format("%,d", 1000000); // "1,000,000"
// 格式化日期
Date date = new Date();
String dateStr = String.format("%tY-%tm-%td", date, date, date);
// 结果:"2024-01-01"
// 左对齐和右对齐
String left = String.format("%-10s", "Hello"); // "Hello "
String right = String.format("%10s", "Hello"); // " Hello"格式化占位符:
java
// %s - 字符串
String.format("Hello %s", "World"); // "Hello World"
// %d - 整数
String.format("Age: %d", 25); // "Age: 25"
// %f - 浮点数
String.format("Price: %.2f", 99.99); // "Price: 99.99"
// %c - 字符
String.format("Char: %c", 'A'); // "Char: A"
// %b - 布尔值
String.format("Flag: %b", true); // "Flag: true"
// %x - 十六进制
String.format("Hex: %x", 255); // "Hex: ff"
// %o - 八进制
String.format("Oct: %o", 64); // "Oct: 100"3.2 MessageFormat
MessageFormat使用:
java
// 格式化消息
String pattern = "姓名:{0},年龄:{1}";
String message = MessageFormat.format(pattern, "张三", 25);
// 结果:"姓名:张三,年龄:25"
// 格式化日期
String datePattern = "日期:{0,date,yyyy-MM-dd}";
String dateMsg = MessageFormat.format(datePattern, new Date());
// 格式化数字
String numPattern = "价格:{0,number,currency}";
String numMsg = MessageFormat.format(numPattern, 99.99);
// 格式化选择
String choicePattern = "性别:{0,choice,0#未知|1#男|2#女}";
String choiceMsg = MessageFormat.format(choicePattern, 1);
// 结果:"性别:男"🎯 四、字符串校验
4.1 空值判断
判断空字符串:
java
String str = "";
// 判断是否为空
boolean isEmpty = str.isEmpty(); // true
boolean isEmpty2 = str.length() == 0; // true
// 判断是否为null或空
boolean isNullOrEmpty = str == null || str.isEmpty();
// Java 11+
boolean isBlank = str.isBlank(); // true(包含空白字符)
// Apache Commons Lang
boolean isBlank2 = StringUtils.isBlank(str); // true
boolean isEmpty3 = StringUtils.isEmpty(str); // true空值安全处理:
java
String str = null;
// 避免空指针
if (str != null && str.length() > 0) {
// 安全操作
}
// 使用Optional
Optional<String> optional = Optional.ofNullable(str);
String result = optional.orElse("default");
// 使用三元运算符
String result2 = str != null ? str : "default";
// Java 8+
String result3 = Optional.ofNullable(str)
.filter(s -> !s.isEmpty())
.orElse("default");4.2 字符串匹配
正则表达式匹配:
java
String str = "hello123";
// 是否匹配正则
boolean matches = str.matches("\\w+"); // true
// 使用Pattern
Pattern pattern = Pattern.compile("\\d+");
Matcher matcher = pattern.matcher(str);
boolean found = matcher.find(); // true
// 查找所有匹配
List<String> matches = new ArrayList<>();
while (matcher.find()) {
matches.add(matcher.group());
}字符串包含:
java
String str = "Hello World";
// 判断包含
boolean contains = str.contains("World"); // true
// 判断开头
boolean startsWith = str.startsWith("Hello"); // true
// 判断结尾
boolean endsWith = str.endsWith("World"); // true
// 忽略大小写
boolean equalsIgnoreCase = str.equalsIgnoreCase("hello world"); // true4.3 字符串校验工具类
常用校验方法:
java
// 邮箱校验
public boolean isValidEmail(String email) {
return email != null && email.matches("^[A-Za-z0-9+_.-]+@(.+)$");
}
// 手机号校验
public boolean isValidPhone(String phone) {
return phone != null && phone.matches("^1[3-9]\\d{9}$");
}
// 身份证号校验
public boolean isValidIdCard(String idCard) {
return idCard != null && idCard.matches("^\\d{17}[\\dXx]$");
}
// URL校验
public boolean isValidUrl(String url) {
try {
new URL(url);
return true;
} catch (MalformedURLException e) {
return false;
}
}🎯 五、字符串转换
5.1 大小写转换
java
String str = "Hello World";
// 转大写
String upper = str.toUpperCase(); // "HELLO WORLD"
// 转小写
String lower = str.toLowerCase(); // "hello world"
// 首字母大写
String capitalized = str.substring(0, 1).toUpperCase() +
str.substring(1).toLowerCase();
// 单词首字母大写(简单版)
String[] words = str.toLowerCase().split(" ");
StringBuilder sb = new StringBuilder();
for (String word : words) {
if (sb.length() > 0) sb.append(" ");
sb.append(word.substring(0, 1).toUpperCase())
.append(word.substring(1));
}
String titleCase = sb.toString(); // "Hello World"5.2 字符串和数字转换
字符串转数字:
java
// String转int
String str = "123";
int num1 = Integer.parseInt(str);
int num2 = Integer.valueOf(str); // 返回Integer对象
// 带默认值
int num3 = Integer.parseInt(str, 10); // 指定进制
// 安全转换
int num4;
try {
num4 = Integer.parseInt(str);
} catch (NumberFormatException e) {
num4 = 0; // 默认值
}
// String转double
String str2 = "3.14";
double d = Double.parseDouble(str2);数字转字符串:
java
int num = 123;
// 基本转换
String str1 = String.valueOf(num); // "123"
String str2 = Integer.toString(num); // "123"
String str3 = "" + num; // "123"(不推荐)
// 格式化转换
String str4 = String.format("%05d", num); // "00123"
String str5 = String.format("%x", num); // "7b"(十六进制)
// 使用StringBuilder
StringBuilder sb = new StringBuilder();
sb.append(num);
String str6 = sb.toString();5.3 字符串和数组转换
java
// 字符串转字符数组
String str = "Hello";
char[] chars = str.toCharArray();
// 字符数组转字符串
char[] chars2 = {'H', 'e', 'l', 'l', 'o'};
String str2 = new String(chars2);
String str3 = String.valueOf(chars2);
// 字符串转字节数组
byte[] bytes = str.getBytes();
byte[] bytes2 = str.getBytes(StandardCharsets.UTF_8);
// 字节数组转字符串
String str4 = new String(bytes);
String str5 = new String(bytes2, StandardCharsets.UTF_8);🎯 六、字符串查找和替换
6.1 查找操作
查找字符串:
java
String str = "Hello World Hello";
// 查找索引
int index1 = str.indexOf("Hello"); // 0
int index2 = str.indexOf("Hello", 1); // 12(从索引1开始查找)
int lastIndex = str.lastIndexOf("Hello"); // 12
// 查找字符
int charIndex = str.indexOf('W'); // 6
// 查找所有匹配位置
List<Integer> indices = new ArrayList<>();
int index = -1;
while ((index = str.indexOf("Hello", index + 1)) != -1) {
indices.add(index);
}
// 结果:[0, 12]正则查找:
java
String str = "abc123def456";
// 使用正则查找
Pattern pattern = Pattern.compile("\\d+");
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
System.out.println("找到: " + matcher.group() + " 位置: " + matcher.start());
}
// 输出:
// 找到: 123 位置: 3
// 找到: 456 位置: 96.2 替换操作
基本替换:
java
String str = "Hello World";
// 替换所有
String replaced1 = str.replace("World", "Java"); // "Hello Java"
String replaced2 = str.replace('l', 'L'); // "HeLLo WorLd"
// 替换第一个
String replaced3 = str.replaceFirst("l", "L"); // "HeLlo World"
// 正则替换
String replaced4 = str.replaceAll("\\s+", "-"); // "Hello-World"正则替换:
java
String str = "abc123def456";
// 替换所有数字
String replaced1 = str.replaceAll("\\d+", "***"); // "abc***def***"
// 替换并引用分组
String replaced2 = str.replaceAll("(\\d+)", "[$1]"); // "abc[123]def[456]"
// 使用Pattern替换
Pattern pattern = Pattern.compile("\\d+");
String replaced3 = pattern.matcher(str).replaceAll("X");🎯 七、字符串其他操作
7.1 字符串截取
java
String str = "Hello World";
// 基本截取
String sub1 = str.substring(6); // "World"
String sub2 = str.substring(0, 5); // "Hello"
// 按长度截取
String sub3 = str.substring(0, Math.min(5, str.length()));
// 安全截取(防止越界)
public String safeSubstring(String str, int start, int end) {
if (str == null) return "";
int len = str.length();
start = Math.max(0, Math.min(start, len));
end = Math.max(start, Math.min(end, len));
return str.substring(start, end);
}7.2 字符串填充
java
// 左填充
String str = "123";
String leftPadded = String.format("%05d", Integer.parseInt(str)); // "00123"
// 右填充
String rightPadded = String.format("%-5s", str); // "123 "
// 使用Apache Commons Lang
StringUtils.leftPad(str, 5, '0'); // "00123"
StringUtils.rightPad(str, 5, ' '); // "123 "7.3 字符串去重和排序
java
// 字符去重
String str = "aabbccdd";
String unique = Arrays.stream(str.split(""))
.distinct()
.collect(Collectors.joining()); // "abcd"
// 字符排序
String sorted = str.chars()
.sorted()
.mapToObj(c -> String.valueOf((char) c))
.collect(Collectors.joining()); // "aabbccdd"📖 学习资源
官方文档
工具库
✅ 学习检查清单
- [ ] 已掌握字符串拼接的各种方法
- [ ] 已掌握字符串分割操作
- [ ] 已熟悉字符串格式化
- [ ] 已掌握字符串校验方法
- [ ] 已了解字符串转换操作
- [ ] 已掌握字符串查找和替换
上一章节:集合操作常用写法
下一章节:日期时间处理常用写法
返回目录:代码规范