[英]No reverse method in String class in Java?
為什么Java中的String
類中沒有反向方法? 相反,在StringBuilder
提供了reverse()
方法? 是否有一個原因? 但String有split()
, regionMatches()
等,它們比reverse()
方法更復雜。
當他們添加這些方法時,為什么不添加reverse()
?
如果您需要歷史原因,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變為如下
並最終在堆上有4個新的String對象。 所以想想如果你有數千個字符串或更多字符串,那么將創建多少對象......這將是非常昂貴的。 所以會占用太多的內存。
所以因為這個String類沒有reverse()方法。
嗯,我認為這可能是因為它是一個immutable
類,所以如果我們有一個反向方法,它實際上會創建一個新對象。
作為旁注,在Scala中你使用相同的java.lang.String
類,你會得到一個reverse
方法(以及各種其他方便的東西)。 它的方式是使用隱式轉換 ,以便您的String
自動轉換為具有reverse
方法的類。 它非常聰明,並且不需要使用數百種方法來膨脹基類。
reverse()作用於此 ,修改當前對象,String對象是不可變的 - 它們不能被修改。
在原位執行reverse()是特別有效的 - 已知大小是相同的,因此不需要分配,循環迭代的數量是副本中的一半,而對於大字符串,內存位置是最佳。 通過查看代碼,我們可以看到為了加快速度而采取了很多措施。 我懷疑作者有一個特定的用例需要高性能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.