Java连接字符串与静态字符串

时间:2016-01-07 16:33:25

标签: java string string-concatenation

我试图更好地理解字符串。我基本上是在制作一个需要大量字符串的程序。但是,很多字符串非常非常相似,只需要在字符串的末尾添加不同的单词。

E.g。

String one = "I went to the store and bought milk"
String two = "I went to the store and bought eggs"
String three = "I went to the store and bought cheese"

所以我的问题是,在处理字符串时最适合采用哪种方法?将2个字符串连接在一起有什么好处而不仅仅是静态字符串,例如性能或内存管理?

E.g。

String one = "I went to the store and bought "
String two = "milk" 
String three = "cheese"
String four = one + two
String five = one + three

我只是想弄清楚处理所有这些字符串的最佳方式。 (如果它有助于我使用一些字符串,我目前有50但这个数字可能会有很大的盈余)

7 个答案:

答案 0 :(得分:2)

如同幽灵一样,代码的主要关注点是可读性。除非您正在制作手机程序,否则无需管理资源。话虽这么说,你是否创造了许多独立的Strings或者将基础String与不同的小块连接在一起并不重要。无论如何,你都不会注意到更好的表现。

答案 1 :(得分:0)

您可以在这样的字符串中设置开头句子

String openingSentence = "I went to the store and bought";

和替代定义每个单词,通过定义一个字符串数组,如下所示::

String[] thingsToBeBought = { "milk", "water", "cheese" .... };

然后你可以做foreach循环并用开头句子连接数组中的每个元素。

答案 2 :(得分:0)

性能明智的最终静态字符串总是更好,因为它们是在编译期间生成的。像这样的东西

final static String s = "static string";

在运行时生成非静态字符串和串联的字符串,如其他示例所示。因此,即使性能对于这么小的事情也几乎无关紧要,第二个例子并不像你的代码中第一个表现那么好:

// not as good performance wise since they are generated at runtime
String four = one + two
String five = one + three

答案 3 :(得分:0)

在Java中,如果连接两个字符串(例如使用'+'),则会创建一个新的String,因此需要对旧内存进行垃圾回收。如果要连接字符串,正确的方法是使用StringBuilder或StringBuffer。

鉴于您对这些字符串的评论确实是URL,您可能希望拥有一个StringBuilder / StringBuffer作为URL基础,然后根据需要附加后缀。

答案 4 :(得分:0)

由于您要将此字符串用作URL,我建议使用StringJoiner(如果您使用的是JAVA 8)。它将与StringBuilder一样高效(每次执行连接时都不会创建新的字符串)并且会在字符串之间自动添加“/”。

StringJoiner myJoiner = new StringJoiner("/")

答案 5 :(得分:0)

在表现上没有明显的差别,所以你采取的方式更多的是偏好。我可能会将句子的第一部分声明为String并将各个购买项目存储在一个数组中。

示例:

String action = "I went to the store and bought ";
String [] items = {"milk", "eggs", "cheese"};

for (int x = 0; x< items.length; x++){
     System.out.println(action + items[x]);
}

答案 6 :(得分:0)

无论是声明每个可能的String还是单独的字符串连接,都不会对您提供的示例中的内存或性能产生任何可测量的影响。在声明真正大量字符串文字的极端情况下,如果声明每个可能的字符串,Java的interned Strings本机哈希表将使用更多内存,因为表的缓存值将更长。

如果使用+运算符连接2个以上的字符串,则将创建额外的String对象以进行GC。例如,如果您有字符串a = "1"b = "2",并且执行String s = "s" + a + b;,Java将首先创建字符串“s1”,然后将其连接以形成第二个字符串“s12”。通过使用StringBuilder之类的东西来避免使用中间字符串。 (这不适用于编译时声明,但它适用于运行时级联。)

如果您正好格式化字符串而不是连接,请使用MessageFormatString.format()。它更漂亮,避免使用+运算符时创建的中间字符串。类似于String urlBase = "http://host/res?a=%s&b=%s"; String url = String.format(urlBase, a, b);,其中ab是查询参数字符串值。