7
votes

Différence entre la chaîne et StringBuilder et leur organisation interne

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.

Alors, comment les Stringbuilders sont-ils organisés en interne ?? La chaîne est une gamme de caractères.

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?

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"


0 commentaires

3 Réponses :


6
votes

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 de capacité 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.

Aussi, ce code: xxx

ne fonctionne pas.

mais celui-ci fait: xxx


3 commentaires

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.



12
votes

i Dunno. Allons voir:


2 commentaires

+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 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 est une matrice dynamique et chaîne comme il est immuable ( La taille fixe) est une matrice normale?



2
votes

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.

StringBuilder's Constructeur par défaut créera un tableau pouvant contenir 16 éléments de caractères. #append (String) Copie les caractères de la chaîne sur le tableau Stringbuidler à l'aide de String # getchars (int, int, char [], int) . La matrice est repoussée à l'aide de Arrays.copyof (char [], int) 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.

Dans les anciennes versions de Java ou 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.

Si vous allez contenir sur une instance StringBuilder, vous pouvez appeler stringbuilder # trimtosize () après avoir terminé les modifications. Il tentera de réduire la capacité de la matrice au minimum requis.

J'espère que cela aide.


0 commentaires