一、概述
Java中的字符串连接是最常见的操作之一。在本教程中,我们将介绍一些字符串连接的方法。但是,我们将重点描述如何使用concat()
和“ +
”运算符方法。最后,我们将讨论如何根据我们需要做的事情来选择正确的。
2. 连接方法
一般来说,在Java 中连接两个或多个字符串有不同的方法。此外,我们将查看一些示例,并对每个示例进行说明。
2.1。使用“ +
”运算符
Java中**最常见的连接方法之一是使用“ +
”运算符**。
“ +
”运算符为字符串连接提供了比其他方法更大的灵活性。首先,它不会为空值抛出任何异常。其次,它将null 转换为其字符串表示形式。此外,我们可以使用它来连接两个以上的字符串。
让我们看一个代码示例:
@Test void whenUsingPlusOperatorANull_thenAssertEquals() { String stringOne = "Hello "; String stringTwo = null; assertEquals("Hello null", stringOne + stringTwo); }
编译器在内部将“ +
”运算符转换为StringBuilder
(或StringBuffer
)类及其append()
方法。
由于“ +
”运算符默默地将参数转换为String
(对对象使用toString()
方法),我们避免了**NullPointerException
** 。但是,我们需要考虑我们的最终字符串结果是否适用于字符串主体中的“null”。
2.2.使用concat()
方法
String
类中的contact()
方法在当前字符串的末尾附加一个指定的字符串。它返回一个组合字符串。
让我们测试一下这种行为:
@Test void whenUsingConcat_thenAssertEquals() { String stringOne = "Hello"; String stringTwo = " World"; assertEquals("Hello World", stringOne.concat(stringTwo)); }
在前面的示例中,stringOne
变量是基本字符串。使用concat()
方法,stringTwo
附加到stringOne
的末尾。concat()
操作是不可变的,所以我们需要一个显式赋值。下一个示例说明了这种情况:
@Test void whenUsingConcatWithOutAssignment_thenAssertNotEquals() { String stringOne = "Hello"; String stringTwo = " World"; stringOne.concat(stringTwo); assertNotEquals("Hello World", stringOne); // we get only Hello }
此外,为了在这种情况下获得最终的连接字符串,我们需要将concat()
结果分配给一个变量:
stringOne = stringOne.concat(stringTwo); assertEquals("Hello World", stringOne);
concat()
的另一个有用特性是当我们需要连接多个String
对象时。这种方法允许。此外,我们还可以附加空格和特殊字符:
@Test void whenUsingConcatToMultipleStringConcatenation_thenAssertEquals() { String stringOne = "Hello"; String stringTwo = "World"; String stringThree = ", in Jav"; stringOne = stringOne.concat(" ").concat(stringTwo).concat(stringThree).concat("@"); assertEquals("Hello World, in [email protected]", stringOne); }
空值呢?当前字符串和要追加的字符串都不能是空值。否则,concat()
方法**会**抛出**NullPointerException
** :
@Test void whenUsingConcatAppendANull_thenAssertEquals() { String stringOne = "Hello"; String stringTwo = null; assertThrows(NullPointerException.class, () -> stringOne.concat(stringTwo)); }
2.3.StringBuilder
类
首先,我们有StringBuilder
类。此类提供append()
方法来执行连接操作。下一个示例向我们展示了它是如何工作的:
@Test void whenUsingStringBuilder_thenAssertEquals() { StringBuilder builderOne = new StringBuilder("Hello"); StringBuilder builderTwo = new StringBuilder(" World"); StringBuilder builder = builderOne.append(builderTwo); assertEquals("Hello World", builder.toString()); }
另一方面,类似的连接方法是StringBuffe
类。与非StringBuilder
(即非线程安全)的StringBuilder 不同,StringBuffer
是同步的(即线程安全)。但它的性能比StringBuilder
差。它有一个append()
方法,就像StringBuilder
一样。
2.4.字符串format()
方法
执行字符串连接的另一种方法是使用String 类中的format()
方法。使用%s,
我们可以通过字符串值或对象连接多个字符串:
@Test void whenUsingStringFormat_thenAssertEquals() { String stringOne = "Hello"; String stringTwo = " World"; assertEquals("Hello World", String.format("%s%s", stringOne, stringTwo)); }
2.5. Java 8 及更高版本中的连接方法
String
类中的join()
方法,对于Java 8 及更高版本,可以执行字符串连接。在这种情况下,此方法将在要连接的字符串之间使用的分隔符作为第一个参数:
@Test void whenUsingStringJoin_thenAssertEquals() { String stringOne = "Hello"; String stringTwo = " World"; assertEquals("Hello World", String.join("", stringOne, stringTwo)); }
从Java 8 开始,添加了StringJoiner
类。此类使用分隔符、前缀和后缀连接String
。以下代码片段是其使用示例:
@Test void whenUsingStringJoiner_thenAssertEquals() { StringJoiner joiner = new StringJoiner(", "); joiner.add("Hello"); joiner.add("World"); assertEquals("Hello, World", joiner.toString()); }
此外,在Java 8 中,通过添加Stream API,我们可以找到收集器。Collectors
类具有joining()
方法。此方法的工作方式类似于String
类中的join()
方法。它用于收藏。以下示例代码片段向我们展示了它是如何工作的:
@Test void whenUsingCollectors_thenAssertEquals() { List<String> words = Arrays.asList("Hello", "World"); String collect = words.stream().collect(Collectors.joining(", ")); assertEquals("Hello, World", collect); }
3. 选择一种方法
最后,如果我们需要在concat()
方法和“ +
”运算符之间进行选择,我们需要考虑一些方面。
首先,concat()
方法只接受字符串。同时,“ +
”运算符接受任何类型并将其转换为字符串。另一方面,concat()
方法在null 值上引发NullPointerExeption
,而“ +
”运算符则不是这样。
此外,两者之间存在性能差异。concat()
方法比“ +
”运算符执行得更好。后者总是创建一个新字符串,而不管字符串的长度。此外,我们需要考虑到concat()
方法仅在要附加的字符串长度大于0 时创建一个新字符串。否则,它返回相同的对象。
4。结论
在本文中,我们快速概述了Java 中的字符串连接。此外,我们详细讨论了使用concat()
和“ +
”运算符来执行字符串连接。最后,我们对concat()
方法和“ +
”运算符以及如何在不同的上下文中选择其中一个进行了比较分析。
0 评论