[Java]字符串操作
在Java字符串算法题目中,掌握各种字符串操作方法至关重要。下面系统性地讲解常用的字符串处理方法:
1. 字符串基础操作
长度和空值判断
String str = "Hello World";
// 获取长度
int len = str.length(); // 11
// 判断是否为空
boolean isEmpty = str.isEmpty(); // false
boolean isBlank = str.isBlank(); // false (Java 11+)
// 空字符串检查
if (str == null || str.isEmpty()) {
// 处理空字符串
}
字符访问
String str = "Hello";
// 获取指定位置字符
char first = str.charAt(0); // 'H'
char last = str.charAt(str.length() - 1); // 'o'
// 字符数组转换
char[] chars = str.toCharArray();
2. 字符串比较
String s1 = "abc";
String s2 = "ABC";
// 精确比较
boolean exact = s1.equals(s2); // false
// 忽略大小写比较
boolean ignoreCase = s1.equalsIgnoreCase(s2); // true
// 字典序比较
int result = s1.compareTo(s2); // 正数:s1 > s2
// 前缀后缀检查
boolean starts = s1.startsWith("ab"); // true
boolean ends = s1.endsWith("bc"); // true
3. 字符串查找
String str = "hello world, hello java";
// 查找字符位置
int firstIndex = str.indexOf('l'); // 2
int lastIndex = str.lastIndexOf('l'); // 20
// 查找子字符串
int subIndex = str.indexOf("hello"); // 0
int subFrom = str.indexOf("hello", 1); // 13
// 检查包含关系
boolean contains = str.contains("world"); // true
4. 字符串截取和分割
截取子串
String str = "Hello World";
// 从指定位置到末尾
String sub1 = str.substring(6); // "World"
// 指定开始和结束位置
String sub2 = str.substring(0, 5); // "Hello"
字符串分割
String data = "apple,banana,orange";
// 按逗号分割
String[] fruits = data.split(",");
// ["apple", "banana", "orange"]
// 限制分割次数
String[] limited = data.split(",", 2);
// ["apple", "banana,orange"]
// 使用正则表达式分割
String complex = "a b c d";
String[] parts = complex.split("\\s+");
// ["a", "b", "c", "d"]
5. 字符串修改
替换操作
String str = "hello world";
// 字符替换
String replaced = str.replace('l', 'L'); // "heLLo worLd"
// 字符串替换
String newStr = str.replace("world", "Java"); // "hello Java"
// 正则替换
String regexReplaced = str.replaceAll("l+", "L"); // "heLo worLd"
大小写转换
String str = "Hello World";
String lower = str.toLowerCase(); // "hello world"
String upper = str.toUpperCase(); // "HELLO WORLD"
去除空格
String str = " hello world ";
String trimmed = str.trim(); // "hello world"
String stripped = str.strip(); // "hello world" (Java 11+)
String leading = str.stripLeading(); // "hello world "
String trailing = str.stripTrailing(); // " hello world"
6. 字符串构建
StringBuilder (非线程安全,性能好)
StringBuilder sb = new StringBuilder();
// 追加操作
sb.append("Hello");
sb.append(" ");
sb.append("World");
// 插入操作
sb.insert(5, " Java");
// 删除操作
sb.delete(5, 10);
// 反转
sb.reverse();
String result = sb.toString();
StringBuffer (线程安全)
StringBuffer sb = new StringBuffer();
// 方法与StringBuilder相同,但线程安全
7. 字符串转换
// 基本类型转字符串
String numStr = String.valueOf(123);
String doubleStr = String.valueOf(45.67);
// 字符串转基本类型
int num = Integer.parseInt("123");
double d = Double.parseDouble("45.67");
// 字符数组转字符串
char[] chars = {'a', 'b', 'c'};
String fromChars = new String(chars);
8. 正则表达式匹配
String str = "abc123def456";
// 检查匹配
boolean matches = str.matches(".*\\d+.*"); // true
// 提取匹配部分
java.util.regex.Pattern pattern = java.util.regex.Pattern.compile("\\d+");
java.util.regex.Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
System.out.println(matcher.group()); // 输出: 123, 456
}
9. 实用算法示例
回文判断
public boolean isPalindrome(String s) {
s = s.toLowerCase().replaceAll("[^a-z0-9]", "");
int left = 0, right = s.length() - 1;
while (left < right) {
if (s.charAt(left) != s.charAt(right)) {
return false;
}
left++;
right--;
}
return true;
}
字符串反转
public String reverseString(String s) {
// 方法1: 使用StringBuilder
return new StringBuilder(s).reverse().toString();
// 方法2: 字符数组
char[] chars = s.toCharArray();
int left = 0, right = chars.length - 1;
while (left < right) {
char temp = chars[left];
chars[left] = chars[right];
chars[right] = temp;
left++;
right--;
}
return new String(chars);
}
最长公共前缀
public String longestCommonPrefix(String[] strs) {
if (strs == null || strs.length == 0) return "";
String prefix = strs[0];
for (int i = 1; i < strs.length; i++) {
while (strs[i].indexOf(prefix) != 0) {
prefix = prefix.substring(0, prefix.length() - 1);
if (prefix.isEmpty()) return "";
}
}
return prefix;
}
10. 性能考虑
- 字符串拼接:使用
+在循环中拼接字符串性能差,推荐使用StringBuilder - 字符串比较:
equals()比较内容,==比较引用 - 大量字符串操作:优先使用
StringBuilder
这些方法覆盖了字符串算法题目中的大部分需求,熟练掌握它们能有效解决各类字符串相关问题。
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果