本文仅供学习参考!
字符串连接可以定义为将两个或多个字符串连接在一起以形成新字符串的过程。大多数编程语言至少提供一种连接字符串的方法。Java 为您提供了多种选择,包括:
- **+**运算符
- **String.concat()**方法
- StringBuilder类
- StringBuffer类
本文将介绍如何使用上述四种方法中的每一种将字符串连接在一起,并提供一些关于如何在给定情况下选择最佳方法的提示。
使用加号 (+) 运算符
这是 Java 中连接字符串最简单且最常用的方法。将加号 ( + ) 运算符放在两个或多个字符串之间会将它们组合成一个全新的字符串。因此,通过串联生成的String对象将存储在 Java 堆中的新内存位置中。但是,如果字符串池中已存在匹配的字符串,则返回对找到的String对象的引用。您可以将其视为一种缓存形式。下面是 Java 中**+**运算符的快速代码示例:
String firstName = "Rob";
String lastName = "Gravelle";
// Outputs "Rob Gravelle"
System.out.println(firstName + " " + lastName);
加号 (+) 运算符的优点:自动类型转换和 Null 处理
+运算符自动将所有本机类型转换为其字符串表示形式,因此它可以处理从ints、float和double到单 ( char ) 字符的所有内容。此外,它不会抛出任何Null值异常,并将Null转换为其String表示形式。下面是一些示例代码,展示了如何在 Java 中使用**+**运算符进行字符串连接:
String fruits = "apples";
int howMany = 4;
String other = null;
// Outputs "I have 4 apples as well as null."
System.out.println("I have " + howMany + " " + fruits + " as well as " + other + ".");
在幕后,+运算符使用本机类型的隐式类型转换和对象的toString()方法将非字符串数据类型静默转换为String ,这就是它避免NullPointerException的方法。唯一的缺点是我们最终会在结果字符串中得到单词“ null ”,这可能不是开发人员想要的。
字符串连接是通过StringBuilder类的**append()方法实现的。+运算符通过将第二个操作数附加到第一个操作数的末尾来生成一个新字符串。**在我们前面的示例中,Java 正在执行以下操作:
String s = (new StringBuilder())
.append("I have ")
.append(howMany)
.append(" ")
.append(fruits)
.append(" as well as ")
.append(other)
.append(".")
.toString();
Java 字符串连接技巧
如果您打算再次使用它,请始终将使用**+运算符连接后返回的字符串存储在变量中。这将避免程序员必须多次经历串联过程。另外,避免使用+**运算符在循环中连接字符串,因为这会导致大量开销。
虽然很方便,但**+**运算符是连接字符串最慢的方法。其他三个选项效率更高,我们接下来会看到。
使用 String.concat() 方法
String.concat方法将指定字符串连接到当前字符串的末尾。其语法为:
@Test
void concatTest() {
String str1 = "Hello";
String str2 = " World";
assertEquals("Hello World", str1.concat(str2));
assertNotEquals("Hello World", str1); // still contains "Hello"
}
我们可以通过链接连续的concat调用来连接多个 String ,如下所示:
void concatMultiple() {
String str1 = "Hello";
String str2 = " World";
String str3 = " from Java";
str1 = str1.concat(" ").concat(str2).concat(str3);
System.out.println(str1); //"Hello World from Java";
}
请注意,当前字符串和要追加的字符串都不能包含Null 值。否则,concat 方法将抛出NullPointerException。
StringBuilder 和 StringBuffer 类
StringBuilder和StringBuffer类是 Java 中连接字符串的最快方法。因此,它们是连接大量字符串的理想选择——尤其是在循环中。这两个类的行为方式大致相同,主要区别在于 StringBuffer是线程安全的,而StringBuilder不是。这两个类都提供了一个**append()**方法来执行串联操作。 append()方法被重载以接受许多不同类型的参数,例如Objects、StringBuilder、int、char、CharSequence、boolean、float、double等。
除了性能优势之外,StringBuffer和StringBuilder还提供了不可变String类的可变替代方案。与包含固定长度、不可变的字符序列的String类不同, StringBuffer和StringBuilder具有可扩展的长度和可修改的字符序列。
下面是一个使用StringBuilder和StringBuffer连接十个整数的数组的示例:
import java.util.stream.IntStream;
import java.util.Arrays;
public class StringBufferAndStringBuilderExample {
public static void main(String[] args) {
// Create an array from 1 to 10
int[] range = IntStream.rangeClosed(1, 10).toArray();
// using StringBuilder
StringBuilder sb = new StringBuilder();
for (int num : range) {
sb.append(String.valueOf(num));
}
System.out.println(sb.toString()); // 12345678910
// using StringBuffer
StringBuffer sbuf = new StringBuffer();
for (int num : range) {
sbuf.append(String.valueOf(num));
}
System.out.println(sbuf.toString()); // 12345678910
}
}
END
本文中,我们全面了解了 Java 将字符串连接在一起的四种主要方法,以及有关如何在给定情况下选择最佳方法的提示。总而言之,当您需要在**+运算符、concat方法和StringBuilder/StringBuffer类之间进行选择时,请考虑您是单独处理字符串还是混合数据类型。您还应该考虑Null值上NullPointerExeptions的可能性。最后,还有性能和可变性的问题。+运算符是今天看到的所有选项中最慢的,而StringBuilder和StringBuffer**类既快速又可变。
如果您确实想查看 Java 中的所有串联选项,版本 8 引入了更多连接String的方法,包括String.join()方法和StringJoiner类。版本 8 还引入了Collectors。Collectors类具有join()方法,其工作方式与String类的**join()**方法非常相似。