可能是副本,因为关于这个主题有很多问题,但我无法找到我想要的东西。
我知道String
是不可变的,StringBuilder
是可变的。我理解这两个术语的本质。我想知道在创建StringBuilder
的实例时内存中究竟发生了什么。像:
StringBuilder s = new StringBuilder();
s[0] = 'a';
一样使用它,所以我们可以称之为数组吗? s.appennd("abc");
并且内存中没有"abc"
足够的连续空间会发生什么?每次我向s
类型变量附加内容时,string
会发生string
新内存位置。答案 0 :(得分:4)
StringBuilder
实际上是在引擎盖下,StringBuilders
链(将它们视为连锁的记忆块)。用户显然正在与一个StringBuilder
进行交互,但这远非如此。
每个StringBuilder
使用基础char
数组,当容量耗尽时,新的StringBuilder
将添加到链中。
记住这一点,您的具体问题的答案将是:
StringBuilder
的默认容量以及它的底层数组是什么。您还可以使用构造函数重载来指定它,以满足您的特定需求。StringBuilder
使用数组,但链中的每个构建器都有自己的数组。StringBuilder
添加到链中,并在运行时认为合适的任何地方分配相应的数组;通常,新构建器将至少使StringBuilder
的总容量加倍,并且新阵列很可能不会连续分配到前一个阵列。显然,这个系统允许动态调整大小,同时避免与调整数组大小和来回复制数据相关的成本。
答案 1 :(得分:0)
StringBuilder允许分配非连续内存以提供单个连续字符串的感知。我在内部相信它是一组指向字符串片段的指针,当你调用" ToString"时会重新组合它们。数组索引的处理只是数学的一个包装。当你.Append()它只是抓取一个新内存块并将字符串片段放在其中,维护片段及其长度的索引列表