2016-04-03 12 views
0
StringBuilder sbt = new StringBuilder(2);// 
    System.out.print(sbt+"G"); 
    sbt.replace(0,2,"Mano"); 
    System.out.println(sbt+"Length is:"+sbt.capacity()); 

Ich erwarte, dass es GManoLength is:4 drucken sollte.Wie funktioniert der String Builder?

Aber es gibt GManoLength is:6

Wie funktioniert diese Zuordnung Arbeit?

I lesen this

Antwort

0

StringBuilder Daten im char[] Array unter der Haube und capacity() Methode gibt die Länge dieser Anordnung (nicht die Länge der anhängenden Werte) gilt.

Wenn die Kapazität erreicht ist und Sie weitere Werte anhängen möchten, sollte das Array erweitert werden. Es ist eine gute Idee, einen zusätzlichen Raum während dieses Prozesses zu geben und nicht tut extention nach jedem append (es ist teuer Betrieb):

int newCapacity = value.length * 2 + 2;//called when capacity is reached during append 

so capacity ist immer größer oder gleich dann die Länge der aktuellen Daten (dieser Wert kann durch den Aufruf length() Verfahren erhalten werden)

2

Sie zeigen nicht die Länge des Inhalts des StringBuilder. Sie zeigen die Kapazität. Der StringBuilder kann beliebig viel Platz reservieren, auch wenn Sie diesen Speicherplatz nie benutzen. Normalerweise ist es eine kluge Sache anzunehmen, dass StringBuilder verwendet wird, um mehr Daten hinzuzufügen, ansonsten würden Sie ein String oder ein anderes Konstrukt mit konstanter Größe verwenden. Wenn Sie die Länge der Daten anzeigen möchten, verwenden Sie length() Methode.

0

Wenn Sie versuchen, dieses 4 Zeichen „Mano“ hinzufügen, um eine StrigBuilder Kapazitäts 2, wobei das Verfahren expandCapacity von AbstractStringBuilder mit minimumCapacity genannt werden, da die MinimumSize- die neue Zeichenfolge zuweisen benötigt:

void expandCapacity(int minimumCapacity) { 
    int newCapacity = value.length * 2 + 2; 
    if (newCapacity - minimumCapacity < 0) 
     newCapacity = minimumCapacity; 
    if (newCapacity < 0) { 
     if (minimumCapacity < 0) // overflow 
      throw new OutOfMemoryError(); 
     newCapacity = Integer.MAX_VALUE; 
    } 
    value = Arrays.copyOf(value, newCapacity); 
} 

Die Das erste, was es zu tun versucht, ist, die aktuelle Kapazität zu verdoppeln und die Summe 2. Deine ursprüngliche Kapazität ist 2, also ist die neue Kapazität 6. Dies ist größer als 4 (die Länge von "Mano"), deshalb bist du der Grund siehe 6.

Verwandte Themen