截取字符串 - string.substring c#




如果字符串在.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