Java中处理大量字符串拼接时,应优先使用StringBuilder或StringBuffer以避免频繁创建对象导致的性能问题;对于集合拼接可选用StringJoiner或String.join();截取字符串需注意索引边界,防止越界异常,可通过预检查和Math.min等方法确保安全性;此外,String类还提供丰富的方法如equals、contains、replace、split等,支持内容比较、查找、替换、分割等常见操作,结合防御性编程可提升代码健壮性。

Java中操作字符串进行拼接和截取,核心在于理解字符串的不可变性。拼接通常会用到
+
concat()
StringBuilder
StringBuffer
substring()
字符串在Java里是个挺有意思的存在,一旦创建,它的内容就固定了,没法直接改。这种“不可变”的特性,既是优点(比如线程安全、哈希值稳定),也带来了一些挑战,尤其是在频繁操作字符串的时候。
字符串拼接(Concatenation)
使用+
立即学习“Java免费学习笔记(深入)”;
String str1 = "Hello"; String str2 = "World"; String result = str1 + " " + str2 + "!"; // 结果是 "Hello World!" System.out.println(result);
背后原理:每次使用
+
String
使用concat()
String
concat()
String strA = "Java"; String strB = "教程"; String combined = strA.concat(strB); // 结果是 "Java教程" System.out.println(combined);
和
+
concat()
String
+
使用StringBuilder
StringBuffer
String
StringBuilder
StringBuffer
synchronized
StringBuilder
// 使用 StringBuilder
StringBuilder sb = new StringBuilder();
sb.append("你好").append(",").append("我是").append("Java").append("!");
String finalString = sb.toString(); // 转换为 String
System.out.println(finalString); // 结果是 "你好,我是Java!"// 如果是多线程环境,或者不确定,可以使用 StringBuffer StringBuffer sbuf = new StringBuffer(); sbuf.append("多线程").append("安全"); String safeString = sbuf.toString(); System.out.println(safeString);
我个人觉得,除非明确知道有并发需求,否则日常开发中`StringBuilder`几乎是首选,它的性能优势很明显。
字符串截取(Substring)
String
substring()
substring(int beginIndex)
String original = "HelloJavaWorld"; String sub1 = original.substring(5); // 从索引5开始截取 System.out.println(sub1); // 结果是 "JavaWorld"
需要注意的是,Java的字符串索引是从0开始的。所以索引5是字符'J'。
substring(int beginIndex, int endIndex)
beginIndex
endIndex
String text = "Java编程指南"; // 截取 "编程" // 'J'是0,'a'是1,'v'是2,'a'是3,'编'是4,'程'是5,'指'是6 String sub2 = text.substring(4, 6); System.out.println(sub2); // 结果是 "编程"
这里
endIndex
当程序需要进行大量的字符串拼接操作时,如果仍然沿用简单的
+
+
String
最核心的优化策略,毫无疑问是使用StringBuilder
StringBuffer
append()
举个例子,假设你要拼接10000个单词:
// 性能不佳的写法
long startTime = System.nanoTime();
String resultBad = "";
for (int i = 0; i < 10000; i++) {
resultBad += "word" + i;
}
long endTime = System.nanoTime();
System.out.println("使用 + 拼接耗时: " + (endTime - startTime) / 1_000_000 + " ms");
// 这种方式会创建大量的 String 对象,性能极差// 推荐的优化写法
long startTimeOpt = System.nanoTime();
StringBuilder sbOpt = new StringBuilder();
// 如果能预估最终字符串的长度,可以预设容量,进一步减少内部数组扩容的开销
// StringBuilder sbOpt = new StringBuilder(10000 * 5); // 假设每个wordX平均5个字符
for (int i = 0; i < 10000; i++) {
sbOpt.append("word").append(i);
}
String resultOpt = sbOpt.toString();
long endTimeOpt = System.nanoTime();
System.out.println("使用 StringBuilder 拼接耗时: " + (endTimeOpt - startTimeOpt) / 1_000_000 + " ms");
// 这种方式只创建少数几个 StringBuilder 内部数组,性能高得多实际运行你会发现,两者的耗时差距是数量级的。
另外,对于某些特定场景,比如需要将集合中的字符串用分隔符连接起来,Java 8引入的
StringJoiner
StringBuilder
import java.util.StringJoiner;
import java.util.Arrays;
import java.util.List;
List<String> items = Arrays.asList("Apple", "Banana", "Orange");
StringJoiner sj = new StringJoiner(", ", "[", "]"); // 分隔符, 前缀, 后缀
for (String item : items) {
sj.add(item);
}
System.out.println(sj.toString()); // 结果是 "[Apple, Banana, Orange]"
// 或者更简洁地结合 Stream API
String joinedString = String.join(" - ", items);
System.out.println(joinedString); // 结果是 "Apple - Banana - Orange"String.join()
总结一下,遇到字符串拼接,特别是循环或大量拼接,优先考虑
StringBuilder
StringBuffer
StringJoiner
String.join()
字符串截取,也就是
substring()
IndexOutOfBoundsException
核心在于:在调用substring()
substring()
beginIndex
beginIndex
length()
endIndex
beginIndex
endIndex
length()
如果这些条件不满足,就会抛出
IndexOutOfBoundsException
来看几个常见的场景和我的处理思路:
防止负数索引或索引过大:
String myString = "HelloWorld";
int begin = -1; // 错误的索引
int end = 100; // 错误的索引
// 错误的调用会导致异常
// String sub = myString.substring(begin);
// String sub2 = myString.substring(0, end);
// 正确的做法:先检查
if (begin >= 0 && begin < myString.length()) {
String sub = myString.substring(begin);
System.out.println("截取结果: " + sub);
} else {
System.out.println("开始索引 " + begin + " 无效。");
}
if (begin >= 0 && end <= myString.length() && begin <= end) {
String sub = myString.substring(begin, end);
System.out.println("截取结果: " + sub);
} else {
System.out.println("截取范围 [" + begin + ", " + end + "] 无效。");
}处理空字符串或长度不足的字符串: 如果字符串是
null
NullPointerException
""
length()
String emptyStr = "";
// String sub = emptyStr.substring(0); // 抛出 IndexOutOfBoundsException
// String sub2 = emptyStr.substring(0, 0); // 这个是合法的,返回空字符串
// 始终先检查非空和长度
if (myString != null && myString.length() > 0) {
// 进行截取操作
// ...
} else {
System.out.println("字符串为空或null,无法截取。");
}我个人的习惯是,在接收外部输入(比如用户输入、文件读取、网络请求)的字符串进行截取时,都会做这些防御性检查。这能极大地提高程序的健壮性,避免一些难以预料的运行时错误。
灵活调整截取范围: 有时候我们想截取固定长度,但字符串可能不够长。
String shortStr = "abc";
int desiredLength = 5;
int actualEndIndex = Math.min(shortStr.length(), desiredLength);
String result = shortStr.substring(0, actualEndIndex);
System.out.println("灵活截取: " + result); // 结果是 "abc"使用
Math.min()
endIndex
记住,防御性编程在字符串处理中尤为重要。多写几行检查代码,可以省去调试时的大量头疼时间。
字符串作为日常编程中使用频率最高的类型之一,除了拼接和截取,Java的
String
这里列举一些我个人觉得非常常用且重要的操作方法:
内容比较:equals()
equalsIgnoreCase()
equals(Object anObject)
==
==
equalsIgnoreCase(String anotherString)
String s1 = "Hello"; String s2 = "hello"; System.out.println(s1.equals(s2)); // false System.out.println(s1.equalsIgnoreCase(s2)); // true
查找与判断:contains()
startsWith()
endsWith()
indexOf()
lastIndexOf()
contains(CharSequence s)
startsWith(String prefix)
endsWith(String suffix)
indexOf(String str)
indexOf(String str, int fromIndex)
lastIndexOf(String str)
String data = "Java programming is fun";
System.out.println(data.contains("pro")); // true
System.out.println(data.startsWith("Java")); // true
System.out.println(data.indexOf("a")); // 1 (第一个'a'的索引)
System.out.println(data.lastIndexOf("a")); // 16 (最后一个'a'的索引)替换:replace()
replaceAll()
replaceFirst()
replace(char oldChar, char newChar)
replace(CharSequence target, CharSequence replacement)
replaceAll(String regex, String replacement)
replaceFirst(String regex, String replacement)
String msg = "Hello World World";
System.out.println(msg.replace('o', 'X')); // HellX WXrld WXrld
System.out.println(msg.replace("World", "Java")); // Hello Java Java
System.out.println(msg.replaceAll("World", "Java")); // Hello Java Java
System.out.println(msg.replaceFirst("World", "Java")); // Hello Java WorldreplaceAll
replaceFirst
大小写转换:toLowerCase()
toUpperCase()
toLowerCase()
toUpperCase()
String mixedCase = "AbCdEf"; System.out.println(mixedCase.toLowerCase()); // abcdef System.out.println(mixedCase.toUpperCase()); // ABCDEF
去除空白:trim()
strip()
stripLeading()
stripTrailing()
trim()
strip()
stripLeading()
stripTrailing()
String spaced = " Hello World \n";
System.out.println("'" + spaced.trim() + "'"); // 'Hello World'
// Java 11+
// System.out.println("'" + spaced.strip() + "'");在处理用户输入或从文件中读取数据时,
trim()
strip()
分割:split()
split(String regex)
String csvData = "apple,banana,orange";
String[] fruits = csvData.split(",");
for (String fruit : fruits) {
System.out.println(fruit);
}
// 输出:
// apple
// banana
// orange这个方法在处理结构化数据时非常有用,比如解析CSV文件或日志行。
这些方法只是
String
以上就是java使用教程怎样操作字符串进行拼接截取 java使用教程的字符串处理方法指南的详细内容,更多请关注php中文网其它相关文章!
java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号