字符串的实现方式是什么导致它们在操作时如此昂贵?
是否无法制作“廉价”的字符串实现?
或者我的理解完全错误?
谢谢
字符串的实现方式是什么导致它们在操作时如此昂贵?
是否无法制作“廉价”的字符串实现?
或者我的理解完全错误?
谢谢
用哪种语言?
字符串通常是不可变的,这意味着对数据的任何更改都会创建一个新的字符串副本。这可能会对大型字符串产生性能影响。
然而,这是一个重要的特性,因为它允许进行优化,例如内部化。内部化通过指向相同数据的相同字符串来减小文本数据的大小。
如果您关心字符串的性能,请使用StringBuilder(在C#和Java中可用)或其他可处理可变文本数据的构造。
如果您正在处理大量文本数据并需要一个强大的字符串解决方案同时仍然节省空间,请考虑使用绳索。
由于在Java中每次创建对象时都会创建新的副本,因此建议使用StringBuffer。
语法
StringBuffer strBuff=new StringBuffer();
strBuff.append("StringBuffer");
strBuff.append("is");
strBuff.append("more");
strBuff.append("economical");
strBuff.append("than");
strBuff.append("String");
String string=strBuff.tostring();
这完全取决于你想用它做什么。大多数情况下,除非是替换直接查找中的单个字符,否则通常需要至少1个新数组分配。在最简单的级别上,字符串是字符数组。因此,你想做的几乎任何事情都涉及迭代、删除或插入新内容到一个数组中。
了解可变字符串、不可变字符串和绳索,并考虑如何在低级语言(比如C语言)中实现常见操作。请考虑以下内容:
为这些情况提供算法将让您感觉到何时应该使用每种类型的存储。
字符串的更改和复制往往涉及内存管理。
由于内存管理往往需要某种全局互斥体,这会影响性能,使您的代码难以在多个核心上扩展。
你想阅读这篇 Joel Spolsky 的文章:
http://www.joelonsoftware.com/articles/fog0000000319.html
我很失望,.NET 没有一个叫做 F***edString
的本地类型。