在循环中推荐使用stringbuilder进行字符串拼接,因为string是不可变的,每次+操作都会创建新对象,导致大量内存开销和频繁垃圾回收,而stringbuilder内部维护可变字符数组,通过append()方法直接在原数组上操作,避免了重复创建对象,显著提升性能;1. 使用+操作符在循环中拼接字符串会因string不可变性导致性能低下;2. concat()方法同样生成新对象,效率不高;3. stringbuilder是非线程安全的可变类,适合单线程下的高效拼接;4. stringbuffer是线程安全的,适用于多线程环境但性能略低;5. 因此在循环拼接时应优先使用stringbuilder以获得最佳性能。

Java字符串的拼接操作,通常我们会用到
+
concat()
StringBuilder
StringBuffer
split()
字符串的拼接,在Java里有几种常见手段,每种都有它的用武之地,但效率和原理却大相径庭。最直观的莫过于
+
"Hello" + " " + "World"
+
String
+
String
concat()
String
str1.concat(str2)
+
String
立即学习“Java免费学习笔记(深入)”;
真正改变游戏规则的是
StringBuilder
StringBuffer
String
StringBuilder
StringBuffer
StringBuilder
至于字符串的分割,
String
split()
String
"apple,banana,orange".split(",").
|
*
这几乎是Java字符串处理中最常被提及的性能优化点,但其背后的原理却值得深思。简单来说,Java中的
String
String
+
String
想象一下,在一个循环里进行上千次甚至上万次的字符串拼接。每一次拼接,JVM都要:
这个过程在内存分配和数据复制上消耗巨大,导致性能急剧下降,尤其当字符串长度越来越长时,复制的数据量也呈线性增长。这就像你每次想给一份文档添加内容,不是直接在原文档上修改,而是把旧文档内容抄一遍,再把新内容抄上去,形成一份全新的文档。效率可想而知。
而
StringBuilder
StringBuffer
append()
String
StringBuilder
举个例子,假设我们要拼接10000个数字:
// 使用 + 操作符 (不推荐在循环中使用)
long startTime = System.nanoTime();
String resultPlus = "";
for (int i = 0; i < 10000; i++) {
resultPlus += i;
}
long endTime = System.nanoTime();
System.out.println("使用 + 操作符耗时: " + (endTime - startTime) + " 纳秒");
// 使用 StringBuilder (推荐)
startTime = System.nanoTime();
StringBuilder resultBuilder = new StringBuilder();
for (int i = 0; i < 10000; i++) {
resultBuilder.append(i);
}
String finalResult = resultBuilder.toString(); // 最终只创建一次String对象
endTime = System.nanoTime();
System.out.println("使用 StringBuilder 耗时: " + (endTime - startTime) + " 纳秒");你会发现
StringBuilder
+
String.split()
处理特殊字符: 正则表达式中,一些字符被赋予了特殊意义,比如:
.
*
+
?
|
[
]
(
)
{}
^
$
如果你想用这些特殊字符作为字面量分隔符,就必须对它们进行转义,即在它们前面加上
\
.
"\."
"."
String data = "item1.item2.item3";
String[] parts = data.split("\."); // 正确:使用 \. 转义句点
System.out.println("分割结果 (句点): " + String.join(", ", parts)); // 输出:item1, item2, item3
String path = "folder\subfolder\file.txt";
String[] pathParts = path.split("\\"); // 正确:使用 \\ 转义反斜杠
System.out.println("分割结果 (反斜杠): " + String.join(", ", pathParts)); // 输出:folder, subfolder, file.txt
// 如果不转义,比如用 "." 分割:
String trickyData = "price.12.34";
String[] trickyParts = trickyData.split("."); // 错误:. 匹配任意字符,会得到空数组或意想不到的结果
System.out.println("错误分割 (未转义句点): " + String.join(", ", trickyParts)); // 可能会输出空,取决于Java版本和具体实现为了避免这种麻烦,当你不确定一个字符串是否包含正则表达式特殊字符时,可以使用
Pattern.quote()
String literalDelimiter = ".";
String[] safeParts = data.split(Pattern.quote(literalDelimiter)); // 安全地使用字面量句点
System.out.println("安全分割 (Pattern.quote): " + String.join(", ", safeParts));处理空字符串:
split()
limit
split()
String csv = "apple,,banana,orange,";
String[] items = csv.split(",");
System.out.println("默认分割 (连续和尾部空): " + String.join("|", items)); // 输出:apple||banana|orange
// 注意:尾部的空字符串被省略了。
// 如果需要保留尾部空字符串,可以使用 limit 参数为负数
String[] allItems = csv.split(",", -1);
System.out.println("保留尾部空字符串: " + String.join("|", allItems)); // 输出:apple||banana|orange|""
split()
String word = "hello";
String[] chars = word.split("");
System.out.println("按字符分割: " + String.join("|", chars)); // 输出:h|e|l|l|o"".split(",")[""]
",".split(",")["", ""]
在实际开发中,我通常会在分割前对字符串进行
trim()
isEmpty()
字符串操作远不止拼接和分割这么简单,Java的
String
去除首尾空白:trim()
strip()
stripLeading()
stripTrailing()
trim()
strip()
stripLeading()
stripTrailing()
String textWithSpaces = " Hello World! ";
System.out.println("trim(): '" + textWithSpaces.trim() + "'"); // 'Hello World!'
System.out.println("strip(): '" + textWithSpaces.strip() + "'"); // 'Hello World!' (更广泛的空白字符)提取子字符串:substring()
substring()
substring(int beginIndex)
substring(int beginIndex, int endIndex)
beginIndex
endIndex-1
String sentence = "The quick brown fox";
String word = sentence.substring(4, 9); // "quick"
System.out.println("Substring: " + word);替换字符或子字符串:replace()
replaceAll()
replaceFirst()
replace(char oldChar, char newChar)
replace(CharSequence target, CharSequence replacement)
replaceAll(String regex, String replacement)
replaceFirst(String regex, String replacement)
String data = "Java is fun, Java is powerful.";
System.out.println("replace 'Java' with 'Python': " + data.replace("Java", "Python"));
System.out.println("replaceAll 'is (\w+)' with 'was $1': " + data.replaceAll("is (\w+)", "was $1"));查找与判断:contains()
startsWith()
endsWith()
indexOf()
lastIndexOf()
contains(CharSequence s)
startsWith(String prefix)
endsWith(String suffix)
indexOf(int ch)
indexOf(String str)
lastIndexOf(int ch)
lastIndexOf(String str)
String email = "user@example.com";
if (email.contains("@") && email.endsWith(".com")) {
System.out.println("Valid email format (simple check).");
}
System.out.println("Index of '@': " + email.indexOf('@'));大小写转换:toUpperCase()
toLowerCase()
String mixedCase = "HelloWorld";
System.out.println("Uppercase: " + mixedCase.toUpperCase());
System.out.println("Lowercase: " + mixedCase.toLowerCase());字符串比较:equals()
equalsIgnoreCase()
compareTo()
equals(Object anObject)
equalsIgnoreCase(String anotherString)
compareTo(String anotherString)
String s1 = "hello";
String s2 = "Hello";
System.out.println("s1 equals s2 (case-sensitive): " + s1.equals(s2)); // false
System.out.println("s1 equalsIgnoreCase s2: " + s1.equalsIgnoreCase(s2)); // true格式化字符串:String.format()
sprintf
String name = "Alice";
int age = 30;
String formattedString = String.format("My name is %s and I am %d years old.", name, age);
System.out.println("Formatted string: " + formattedString);高效地连接字符串数组/集合:String.join()
StringJoiner
String.join()
List<String> fruits = Arrays.asList("apple", "banana", "cherry");
String joinedFruits = String.join(" - ", fruits);
System.out.println("Joined fruits: " + joinedFruits); // apple - banana - cherry
// StringJoiner 提供更灵活的控制,可以指定前缀和后缀
StringJoiner sj = new StringJoiner(", ", "[", "]");
sj.add("red").add("green").add("blue");
System.out.println("StringJoiner result: " + sj.toString()); // [red, green, blue]这些实用技巧,配合对
String
StringBuilder
StringBuffer
以上就是java怎样实现字符串的拼接与分割操作 java字符串处理的实用技巧指南的详细内容,更多请关注php中文网其它相关文章!
java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号