我试图更好地理解字符串。我基本上是在制作一个需要大量字符串的程序。但是,很多字符串非常非常相似,只需要在字符串的末尾添加不同的单词。
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但这个数字可能会有很大的盈余)
答案 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
之类的东西来避免使用中间字符串。 (这不适用于编译时声明,但它适用于运行时级联。)
如果您正好格式化字符串而不是连接,请使用MessageFormat
或String.format()
。它更漂亮,避免使用+
运算符时创建的中间字符串。类似于String urlBase = "http://host/res?a=%s&b=%s"; String url = String.format(urlBase, a, b);
,其中a
和b
是查询参数字符串值。