簡體   English   中英

Java中的String類沒有反向方法?

[英]No reverse method in String class in Java?

為什么Java中的String類中沒有反向方法? 相反,在StringBuilder提供了reverse()方法? 是否有一個原因? 但String有split()regionMatches()等,它們比reverse()方法更復雜。

當他們添加這些方法時,為什么不添加reverse()

因為你在StringBuilder中有它,所以在String中不需要它,對吧? :-)

說真的,在設計API時,你可以包含很多東西。 然而,為了簡單和清楚起見,有意地保持接口小。 谷歌在“API設計”上,你會發現大量 網頁都同意這一點。

如果你真的需要它,你就是這樣做的:

str = new StringBuilder(str).reverse().toString();

如果您需要歷史原因,String在Java中是不可變的,即如果不創建另一個String,則無法更改給定的String。

雖然這本身並不壞“,但Java的初始版本錯過了像StringBuilder這樣的類。 相反,String本身包含(並且仍然包含)許多“改變”String的方法,但由於String是不可變的,因此這些方法中的每一個實際上都創建並返回一個NEW String對象。

這導致了簡單的表達式:

String s = "a" + anotherString.substr(10,5).trim().toLowerCase();

實際上在ram中創建類似於5個字符串的東西,其中4個絕對無用,具有明顯的性能問題(盡管已經對底層char []數組進行了一些優化)。

為了解決這個問題,Sun引入了StringBuilder和其他不可變的類。 這些類可以自由修改單個char []數組,因此調用方法不需要生成許多中間String實例。

他們最近添加了“反向”,所以他們將它添加到StringBuilder而不是String,因為它現在是操作字符串的首選方式。

從理論上講,String可以提供它並只返回正確的結果作為新的String。 當您了解Java基礎庫時,它只是一個設計選擇。

字符串是不可變的,這意味着它不能被更改。

當你反轉一個字符串時,發生的事情就是每個字母都是自己打開的,這意味着它每次都會創建新的對象。

讓我們看看示例:這意味着例如Hello變為如下

  • elloH lloeH loleH olleH

並最終在堆上有4個新的String對象。 所以想想如果你有數千個字符串或更多字符串,那么將創建多少對象......這將是非常昂貴的。 所以會占用太多的內存。

所以因為這個String類沒有reverse()方法。

嗯,我認為這可能是因為它是一個immutable類,所以如果我們有一個反向方法,它實際上會創建一個新對象。

作為旁注,在Scala中你使用相同的java.lang.String類,你會得到一個reverse方法(以及各種其他方便的東西)。 它的方式是使用隱式轉換 ,以便您的String自動轉換為具有reverse方法的類。 它非常聰明,並且不需要使用數百種方法來膨脹基類。

reverse()作用於此 ,修改當前對象,String對象是不可變的 - 它們不能被修改。

在原位執行reverse()是特別有效的 - 已知大小是相同的,因此不需要分配,循環迭代的數量是副本中的一半,而對於大字符串,內存位置是最佳。 通過查看代碼,我們可以看到為了加快速度而采取了很多措施。 我懷疑作者有一個特定的用例需要高性能。

暫無
暫無

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

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