1.简介
Java提供了大量专用于 连接 字符串 的方法和类 。
在本教程中,我们将深入研究其中的几个,并 概述一些常见的陷阱和不良做法。
2. StringBuilder
首先是简陋的 StringBuilder。 此类 提供了一个 String 构建实用程序数组 ,可以轻松处理 String 操作。
让我们使用 StringBuilder 类构建 String 连接 的快速示例 :
StringBuilder stringBuilder = new StringBuilder( 100 ); stringBuilder.append( "Baeldung" ); stringBuilder.append( " is" ); stringBuilder.append( " awesome" ); assertEquals( "Baeldung is awesome" , stringBuilder.toString());
在内部, StringBuilder 维护一个可变的字符数组。 在我们的代码示例中,我们通过 StringBuilder 构造函数声明它的 初始大小为100 。 由于这个大小声明, StringBuilder 可以是一种 连接 字符串 的非常有效的 方法 。
另外值得一提的是, StringBuffer是同步版本的StringBuilder
虽然同步通常与线程安全同义,但由于 StringBuffer的 构建器模式,不建议在多线程应用程序中使用同步 。虽然对同步方法的单独调用是线程安全的,但多个调用不是。
3.加法运算符
接下来是加法运算符(+)。这是导致添加数字的相同运算符, 并在应用于 字符串 时重载以连接 。
我们来看看它是如何工作的:
String myString = "The " + "quick " + "brown " + "fox..." ; assertEquals( "The quick brown fox..." , myString);
乍一看,这似乎比 StringBuilder 选项更简洁 。但是,当源代码编译时, +符号转换为 StringBuilder.append() 调用的链 。 因此, 混合使用 StringBuilder 和+ 连接 方法 被 认为是不好的做法 。
此外, 应避免使用循环内的+运算符进行 字符串 连接。由于 String 对象是不可变的,因此每次连接调用都将导致创建一个新的 String 对象。
4. String的方法
4.1 String.concat
不出所料, String.concat 方法是我们尝试连接 String 对象时的第一个调用方式 。 此方法返回一个 String 对象,因此将该方法链接在一起是一个有用的功能。
String myString = "Both" .concat( " fickle" ) .concat( " dwarves" ) .concat( " jinx" ) .concat( " my" ) .concat( " pig" ) .concat( " quiz" ); assertEquals( "Both fickle dwarves jinx my pig quiz" , myString);
在这个例子中,我们的链以 String 文字 开头, 然后 concat 方法允许我们链接调用以追加更多的 字符串 。
4.2 String.format
接下来是对 的String.format 方法,这使我们能够注入多种的Java 对象 到 字符串 的模板。
String.format 方法签名需要一个 单一的 字符串 表示我们的模板 。此 模板包含'%'字符,用于表示各种 对象 应放置 在其中的位置。
一旦我们的模板被声明,它就会 获取一个注入 模板 的 可变Object 数组 。
让我们看一下如何使用一个简单的例子:
String myString = String.format( "%s %s %.2f %s %s, %s..." , "I" , "ate" , 2.5056302 , "blueberry" , "pies" , "oops" ); assertEquals( "I ate 2.51 blueberry pies, oops..." , myString);
正如我们上面所看到的,该方法已将我们的 字符串 注入正确的格式。
4.3 String.join (Java 8+)
如果我们的 应用程序在Java 8 或更高版本 上运行 ,我们可以利用 String.join 方法。有了这个,我们可以 加入一个带有公共分隔符的 字符串 数组 ,确保不会错过任何空格。
String[] strings = { "I'm" , "running" , "out" , "of" , "pangrams!" }; String myString = String.join( " " , strings); assertEquals( "I'm running out of pangrams!" , myString);
这种方法的一个巨大优势是不必担心字符串之间的分隔符。
5 StringJoiner (Java 8+)
StringJoiner 将所有 String.join 功能抽象 为一个易于使用的类。该 构造函数有一个分隔符,使用可选的前缀和后缀 。我们可以使用名称很好的 add 方法追加 Strings 。
StringJoiner fruitJoiner = new StringJoiner(