簡體   English   中英

Java連接字符串與靜態字符串

[英]Java concatenate strings vs static strings

我試圖更好地理解字符串。 我基本上是在制作一個需要大量字符串的程序。 但是,很多字符串非常非常相似,只需要在字符串末尾使用不同的單詞。

例如

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個字符串連接在一起有什么好處而不僅僅是靜態字符串,例如性能或內存管理?

例如

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

我只想弄清楚處理所有這些字符串的最佳方法。 (如果它有助於放置我正在使用的一些字符串,我目前有50但這個數字可能會有大量盈余)

正如幽靈所說,代碼的主要關注點是可讀性。 除非您正在制作手機程序,否則無需管理資源。 話雖這么說,無論你是創建很多獨立的Strings還是連接一個基本String與不同的小String ,這無關緊要。 無論如何,你都不會注意到更好的表現。

您可以在這樣的字符串中設置開頭句子

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

和替代定義每個單詞,通過定義一個字符串數組,如下所示::

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

然后你可以做foreach循環並用開頭語句連接數組中的每個元素。

性能方面的最終靜態字符串總是更好,因為它們是在編譯期間生成的。 像這樣的東西

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

在Java中,如果連接兩個字符串(例如使用'+'),則會創建一個新的String,因此需要對舊內存進行垃圾回收。 如果要連接字符串,正確的方法是使用StringBuilder或StringBuffer。

鑒於您對這些字符串的評論確實是URL,您可能希望擁有一個StringBuilder / StringBuffer作為URL基礎,然后根據需要附加后綴。

由於您將使用此字符串作為URL,我建議使用StringJoiner(如果您使用的是JAVA 8)。 它將與StringBuilder一樣高效(每次執行連接時都不會創建新的字符串)並且會在字符串之間自動添加“/”。

StringJoiner myJoiner = new StringJoiner("/")

在性能方面沒有明顯的差異,所以你采取的方式更多的是偏好。 我可能會將句子的第一部分聲明為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]);
}

無論是聲明每個可能的String還是單獨的字符串連接,都不會對您提供的示例中的內存或性能產生任何可測量的影響。 在宣布真正大量的字符串文字的極端情況下,Java的原生哈希表實習字符串如果聲明每一個可能的字符串將使用更多的內存,因為表的緩存值會更長。

如果使用+運算符連接2個以上的字符串,則將創建額外的String對象以進行GC。 例如,如果你有字符串a = "1"b = "2" ,並且String s = "s" + a + b; ,Java將首先創建String“s1”,然后連接它以形成第二個字符串“s12”。 通過使用StringBuilder東西來避免使用中間字符串。 (這不適用於編譯時聲明,但它適用於運行時級聯。)

如果您正在格式化 String而不是簡單地連接 ,請使用MessageFormatString.format() 它更漂亮,避免使用+運算符時創建的中間字符串。 所以類似於, String urlBase = "http://host/res?a=%s&b=%s"; String url = String.format(urlBase, a, b); String urlBase = "http://host/res?a=%s&b=%s"; String url = String.format(urlBase, a, b); 其中ab是查詢參數String值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM