2016-04-03 23 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()); 

GManoLength is:4 yazdıracağını umuyorum.Dize oluşturucu nasıl çalışır?

Ama GManoLength is:6 bu tahsisat nasıl çalışır

döndürür?

I this

cevap

0

StringBuilder başlık altında char[] dizi verileri tutar ve capacity() metot, bu dizi (ekteki değerler uzunluk) uzunluğu ile döner okuyun.

Kapasiteye ulaşıldığında ve daha fazla değer eklemek istediğinizde, dizi genişletilmelidir.

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

yüzden capacity daima büyüktür veya daha sonra gerçek verilerin uzunluğunu eşittir: işlem sırasında fazladan bir boşluk vermek ve her append sonra genişleme yapmayın iyi bir fikir (pahalı bir işlemdir)

2

için uzunluğu StringBuilder içeriğinin gösterilmiyor (bu değer length() yöntemini çağırarak elde edilebilir). kapasite gösteriliyor. StringBuilder, o alanı hiç kullanmasanız bile, istediği kadar alan ayırabilir. Genellikle, StringBuilder'ın içine daha fazla veri eklemek için kullanılacağını düşünmek akıllıca bir şeydir, aksi takdirde bir String veya başka bir sabit boyutlu yapı kullanırsınız.

Verilerin uzunluğunu göstermek istiyorsanız, length() yöntemini kullanın. Eğer kapasite 2'nin bir StrigBuilder bu 4 karakter "Mano" eklemeye çalıştığınızda MinimumSize yeni dize ayırmaya gerektiği gibi

0

, AbstractStringBuilder gelen yöntem expandCapacity minimumCapacity ile çağrılır:

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); 
} 

Yapmaya çalıştığı ilk şey, mevcut kapasiteyi ve toplamı ikiye katlamaktır. 2. Orijinal kapasiteniz 2, yani newCapacity 6 olacaktır. Bu 4'ten daha büyüktür ("Mano" nin uzunluğu) bu yüzden neden bkz. 6.