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( ", " ); fruitJoiner.add( "Apples" ); fruitJoiner.add( "Oranges" ); fruitJoiner.add( "Bananas" ); assertEquals( "Apples, Oranges, Bananas" , fruitJoiner.toString());
通过使用这个类而不是 String.join 方法, 我们可以在程序运行时追加 Strings ; 没有必要先创建阵列!
有关更多信息和示例,请访问我们关于 StringJoiner的文章。
6. Arrays.toString
关于数组的主题, Array 类还包含 一个方便的 toString 方法,它很好地格式化了一个对象数组。 该 阵列。 toString 方法还调用任何封闭对象的 toString 方法 - 所以我们需要确保我们有一个已定义的方法。
String[] myFavouriteLanguages = { "Java" , "JavaScript" , "Python" }; String toString = Arrays.toString(myFavouriteLanguages); assertEquals( "[Java, JavaScript, Python]" , toString);
不幸的是, 阵列。 toString 方法不可自定义,只 输出包含在方括号中的 字符串 。
7 Collectors.joining (Java 8+)
最后,让我们看一下 Collectors.joining 方法,它 允许我们将 Stream 的输出 汇集 到一个 String中。
List<String> awesomeAnimals = Arrays.asList( "Shark" , "Panda" , "Armadillo" ); String animalString = awesomeAnimals.stream().collect(Collectors.joining( ", " )); assertEquals( "Shark, Panda, Armadillo" , animalString);
使用流可以解锁与Java 8 Stream API相关的所有功能,例如过滤,映射,迭代等。
详情:https://www.lvbby.com/p/md/1902011035501582739001