Speicherzuweisung von String Builder. Was passiert im Gedächtnis? StringBuilder vs. String

Speicherzuweisung von String Builder. Was passiert im Gedächtnis? StringBuilder vs. String

Ein StringBuilder ist in Wirklichkeit unter den Hauben eine Kette von StringBuilders (Betrachten Sie sie als verkettete Erinnerungsblöcke). Der Benutzer interagiert anscheinend mit einem einzigen StringBuilder aber das ist alles andere als wahr.

Jeweils StringBuilder verwendet einen zugrunde liegenden char Array und neu StringBuilder s werden der Kette hinzugefügt, wenn die Kapazität erschöpft ist.

Vor diesem Hintergrund wären die Antworten auf Ihre spezifischen Fragen:

  1. Schauen Sie sich die Implementierung an, um zu sehen, was die Standardkapazität eines StringBuilder ist und daher ist es das zugrunde liegende Array. Sie können es auch mit einer Konstruktorüberladung angeben, um Ihren speziellen Anforderungen gerecht zu werden.
  2. Ja, StringBuilder unter den Hauben verwendet ein Array, aber jeder Builder in der Kette hat sein eigenes Array.
  3. Ja und nein. Der Speicher für das Array jedes internen Builders in der Kette wird nacheinander zugewiesen, aber die verschiedenen Speicherblöcke müssen nicht und werden höchstwahrscheinlich nicht nacheinander zugewiesen.
  4. Wenn der Platz nicht ausreicht, ein neues StringBuilder wird der Kette hinzugefügt und das entsprechende Array wird zugewiesen, wo immer die Laufzeit es für richtig hält; normalerweise wird der neue Erbauer die Gesamtkapazität des StringBuilder mindestens verdoppeln und das neue Array wird höchstwahrscheinlich nicht fortlaufend dem vorherigen zugewiesen.

Offensichtlich ermöglicht dieses System eine dynamische Größenänderung, während die Kosten vermieden werden, die mit der Größenänderung von Arrays und dem Hin- und Herkopieren von Daten verbunden sind.