Parlons d'abord de String :
Une fois un objet String créé, sa valeur ne peut plus être modifiée. Si vous souhaitez le modifier, il sera réinitialisé. Ouvrez de l'espace mémoire pour stocker l'objet modifié, c'est-à-dire modifier la référence String.
Étant donné que la couche inférieure de String utilise un tableau pour stocker les valeurs, la longueur du tableau ne peut pas être modifiée, ce qui conduit au problème ci-dessus.
Si nous devons modifier fréquemment une chaîne pendant le processus de développement réel, l'utilisation de String entraînera un gaspillage d'espace mémoire. Comment devrions-nous résoudre ce problème ?
La réponse est d'utiliser StringBuffer pour résoudre ce problème.
Parlons de StringBuffer en détail :
StringBuffer est similaire à String La couche inférieure utilise également un tableau pour stocker les valeurs de chaîne et la longueur par défaut du tableau. est 16, c'est-à-dire un objet StringBuffer vide
, la longueur du tableau est de 16. L'instanciation d'un objet StringBuffer crée un tampon de chaîne de 16 caractères.
Mais lorsque nous appelons le constructeur paramétré pour créer un objet StringBuffer, la longueur du tableau n'est plus de 16. Au lieu de cela, la longueur du tableau est déterminée en fonction de la valeur de l'objet actuel
.La longueur du tableau La longueur est "la longueur de la valeur de l'objet actuel + 16".
Ainsi, après la création d'un StringBuffer, il reste 16 caractères d'espace pour modifier sa valeur. Si la plage de valeurs modifiée dépasse 16 caractères, il vérifiera d'abord si la capacité du tableau de caractères d'origine de l'objet
StringBuffer peut contenir la nouvelle chaîne. Si ce n'est pas le cas, le tableau de caractères sera étendu.
Comment StringBuffer se développe-t-il ?
La logique de l'expansion est de créer un nouveau tableau de caractères, de doubler la capacité existante et d'en ajouter 2. S'il n'est toujours pas assez grand, il sera directement égal à la capacité requise. Une fois l'expansion
terminée, copiez le contenu du tableau d'origine dans le nouveau tableau et enfin pointez le pointeur vers le nouveau tableau de caractères.
Regardons le frère de StringBuffer - StringBuilder
StringBuilder et StringBuffer ont la même classe parent, AbstractStringBuilder, et les interfaces implémentées sont exactement les mêmes, toutes deux implémentées
java.io.Serialised, CharSequence deux interfaces.
Alors quelle est la différence entre eux ?
La plus grande différence est que StringBuffer implémente la synchronisation pour presque toutes les méthodes, le thread est relativement sûr et la synchronisation des données peut être garantie dans un système multithread
StringBuilder ne le fait pas ; implémente la synchronisation. Il n'est pas thread-safe et StringBuilder ne peut pas être utilisé dans des systèmes multithread.
Scénarios d'utilisation de StringBuffer et StringBuilder :
Utilisez StringBuffer lorsque la sécurité des threads doit être prise en compte. Si la sécurité des threads n'a pas besoin d'être prise en compte, elle peut être utilisée dans. scénarios où l’efficacité est recherchée.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!