Ceci est une question très fondamentale. L'étendue de la réponse que je connaisse est que les cordes sont immuables. Les Stringbuilders ne sont pas, vous pouvez donc ajouter des caractères à la fin. P>
Alors, comment les Stringbuilders sont-ils organisés en interne ?? La chaîne est une gamme de caractères. P>
Stringbuilder est-il un tableau de caractères aussi? Donc, j'ai un stringbuilder my_obj = "bonjour". Maintenant, si j'essaie d'ajouter des personnages à la fin de My_Obj, ne signifie-t-il pas que vous créez un nouvel objet de tableau et de copier tous ces caractères en un nouveau? Si oui, comment est-il plus efficace qu'une chaîne? P>
Et une autre question que j'ai à l'esprit est, comment marquez-t-elle la fin d'un StringBuilder? Comme en C, nous utilisons un "/ 0" p>
3 Réponses :
La plupart de l'implémentation StringBuilder provient de abstractstringbuilder et à la mise en œuvre du Sun C'est une enveloppe autour d'un tableau de charcuterie. Il n'y a pas de marquage de la fin de la chaîne, la classe elle-même Maison une variable de comptage qui dit à quel point la corde est vraiment. Il existe également une méthode forte> de capacité forte> qui va vous dire à quel point le réseau réel est (et une méthode de trimtosize pour couper le constructeur de chaîne à un tableau aussi gros que la chaîne stockée actuelle).
Les nouveaux tableaux ne sont créés que lorsque vous atteignez la capacité actuelle du constructeur de cordes et que cette opération n'est pas coûteuse car elle utilise la méthode ArrayCopy et la capacité double toujours, de sorte que vous croîtez, il est moins probable que vous atteignez moins la limite. Si vous connaissez à l'avance la taille, vous pensez que le constructeur de cordes vous sera également, vous pouvez également définir sur son constructeur de sorte qu'il n'a pas à copier le contenu sur le nouveau tableau. P>
Aussi, ce code: p> ne fonctionne pas. p> mais celui-ci fait: p>
Merci, mes doutes sont clarifiés :).
Nitpick - Il y a des circonstances où la capacité de plus que double, et d'autres où il double que double. (Regardez le code.) Toutefois, ces cas sont l'exception, de sorte que vous êtes essentiellement juste.
Maintenant, assurez-vous de savoir comment la nettecapacité négative peut éventuellement se produire puisque toutes les méthodes validées contre les valeurs négatives et le constructeur StringBuilder Javadoc dit qu'il va jeter une exception si une valeur négative est fournie.
i Dunno. Allons voir:
StringBuilder sb = new StringBuilder(20); sb.append("Hello"); ... sb.append(" there");
- http://www.docjar.com/html/ API / Java / Lang / abstractstringbuilder.java.html LI> ul>
45 * The value is used for character storage. 46 */ 47 char[] value; 48 49 /** 50 * The count is the number of characters used. 51 */ 52 int count;
+1 pour souligner que la source est disponible pour quiconque d'aller chercher eux-mêmes.
Si le comte de la matrice interne de stringbuilder code> est plus gros que la longueur de la chaîne réelle, est que la moyenne de la chaîne, est de la moyenne
stringbuilder code> est une matrice dynamique et
chaîne code> comme il est immuable ( La taille fixe) est une matrice normale?
StringBuilder n'est pas plus efficace que la chaîne si vous ne prévoyez pas de modifier la valeur. Il est plus efficace si vous souhaitez appuyer / supprimer des caractères vers / depuis une chaîne. p>
StringBuilder's Constructeur par défaut créera un tableau pouvant contenir 16 éléments de caractères. Dans les anciennes versions de Java ou strong> Lorsque vous êtes concaténant des chaînes à l'intérieur d'une boucle, chaque concaténation de chaîne avec l'opérateur + crée un nouvel objet de chaîne. StringBuilder est plus rapide car il crée moins d'objets. P>
Si vous allez contenir sur une instance StringBuilder, vous pouvez appeler J'espère que cela aide. P> #append (String) Code> Copie les caractères de la chaîne sur le tableau Stringbuidler à l'aide de
String # getchars (int, int, char [], int) code>. La matrice est repoussée à l'aide de
Arrays.copyof (char [], int) code> uniquement lorsqu'il n'y a pas d'espace pour ajouter plus de caractères. Chaque fois que cela arrive, la capacité de la matrice est doublée. La fin est marquée en comptant le nombre de caractères dans la matrice. P>
stringbuilder # trimtosize () code> après avoir terminé les modifications. Il tentera de réduire la capacité de la matrice au minimum requis. P>