c# - first - wpf substring




如果字符串在.NET中不可變,那麼為什麼子字符串需要O(n)次? (3)

Java用於引用較大的字符串,但是:

Java改變了它的行為 ,以避免內存洩漏。

我覺得它可以改進,但為什麼不只是有條件地進行複制呢?

如果子字符串至少是父代的一半,則可以引用父代。 否則,人們可以製作一份副本。 這樣可以避免洩漏大量內存,同時仍然可以提供顯著的優勢。

鑑於字符串在.NET中是不可變的,我想知道為什麼它們被設計成string.Substring()需要O( substring.Length )時間,而不是O(1)

即什麼是權衡,如果有的話?


Java(與.NET相對)提供了兩種執行Substring() ,您可以考慮是僅保留一個引用還是將整個子字符串複製到新的內存位置。

簡單的.substring(...)與原始String對象共享內部使用的char數組,如果需要,您可以使用new String(...)將其複製到新數組(如果需要)(以避免妨礙垃圾回收一)。

我認為這種靈活性對於開發者來說是最好的選擇。


正是因為字符串是不可變的.Substring必須複製至少一部分原始字符串。 複製n個字節應該花費O(n)次。

你如何認為你會在一段時間內復制一堆字節?

編輯:Mehrdad建議不要復製字符串,但保留一個參考。

考慮使用.Net,一個多兆字節的字符串,某人在其上調用.SubString(n, n+3) (對於字符串中間的任何n)。

現在,僅僅因為一個引用持有4個字符,ENTIRE字符串不能被垃圾收集? 這似乎是對空間的荒謬浪費。

此外,跟踪對子字符串(甚至可能在子字符串內)的引用,並嘗試在最佳時間進行複制以避免擊敗GC(如上所述),這使得這個概念成為一場噩夢。 複製.SubString並維護簡單的不可變模型要簡單得多,而且更可靠。

編輯:這裡有一個很好的一點閱讀關於在更大的字符串中保持對子字符串的引用的危險。





time-complexity