Ajouter un caractère à une chaîne à une position donnée

1. Introduction

Dans ce tutoriel rapide, nous allons montrer comment ajouter un caractère à n'importe quelle position donnée dans une chaîne en Java .

Nous présenterons trois implémentations d'une fonction simple qui prend la chaîne d' origine , un caractère et la position où nous devons l'ajouter.

Étant donné que la classe String est définitive et immuable, la fonction doit renvoyer une nouvelle chaîne avec le caractère ajouté.

2. Utilisation d'un tableau de caractères

Ici, l'idée est de créer un nouveau tableau de caractères et de copier les caractères de la chaîne d' origine avant la position donnée.

Après cela, nous mettons le nouveau caractère à la position et copions le reste des caractères de la chaîne d' origine dans les positions suivantes du nouveau tableau.

Enfin, nous construisons la chaîne souhaitée à partir de ce tableau.

public String addChar(String str, char ch, int position) { int len = str.length(); char[] updatedArr = new char[len + 1]; str.getChars(0, position, updatedArr, 0); updatedArr[position] = ch; str.getChars(position, len, updatedArr, position + 1); return new String(updatedArr); }

Par rapport aux deux autres méthodes, il s'agit d'une approche de conception de bas niveau et nous offre le plus de flexibilité.

3. Utilisation de la méthode substring

Une approche plus simple et de niveau supérieur consiste à utiliser la méthode substring () de la classe String . Il prépare la chaîne en concaténant:

  1. La sous - chaîne de l'original cordes avant la position
  2. Le nouveau personnage
  3. La sous - chaîne de l'original cordes après la position
public String addChar(String str, char ch, int position) { return str.substring(0, position) + ch + str.substring(position); }

Bien que le code ci-dessus soit plus lisible, il présente un inconvénient en ce qu'il crée un certain nombre d'objets temporaires pour déterminer le résultat. Comme String est une classe immuable, chaque appel à sa méthode substring () crée une nouvelle instance String .

Enfin, lorsque nous concaténons les parties, le compilateur crée un objet StringBuilder pour les ajouter une par une. Chaque objet String et StringBuilder alloue des emplacements de mémoire distincts pour son tableau de caractères interne.

Cette implémentation doit également copier tous les caractères trois fois d'un tableau à un autre.

Si nous devons appeler la méthode un grand nombre de fois, les objets temporaires peuvent remplir la mémoire du tas et cela déclenchera le GC très fréquemment. Cela peut également affecter les performances dans une certaine mesure.

4. Utilisation d'un StringBuilder

StringBuilder est une classe utilitaire fournie par la bibliothèque Java pour construire et manipuler des objets String de plusieurs manières.

Nous pouvons implémenter la même fonctionnalité en utilisant la méthode insert () de la classe StringBuilder :

public String addChar(String str, char ch, int position) { StringBuilder sb = new StringBuilder(str); sb.insert(position, ch); return sb.toString(); }

Le code ci-dessus doit créer un seul objet StringBuilder pour insérer le caractère à la position. Il alloue la même quantité de mémoire que la chaîne d' origine , mais pour créer une place pour le nouveau caractère, le tableau sous-jacent décale les caractères suivants d'une position.

Bien que l'utilisation d'un StringBuilder puisse être plus lente, elle n'a pas la charge de mémoire liée à l'initialisation des objets temporaires. On se retrouve également avec un code simple et lisible.

5. Conclusion

Dans cet article, nous nous sommes concentrés sur plusieurs façons d'ajouter un caractère dans un objet String en Java . Nous avons vu que l'implémentation utilisant un tableau de caractères offre les meilleures performances et qu'avec la méthode substring donne une approche plus lisible.

La manière préférée d'implémenter la solution est d'utiliser la classe StringBuilder - car elle est simple, moins sujette aux bogues et offre des performances bonnes et stables .

Comme d'habitude, le code source complet du didacticiel ci-dessus est disponible à l'adresse over sur GitHub.