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

Ajouter un personnage à une chaîne à une position donnée

1. introduction

Dans ce rapide tutoriel, nous allonsdemonstrate how to add a character at any given position in a String in Java.

Nous allons présenter trois implémentations d'une fonction simple qui prend le caractère d'origineString, et la position où nous devons l'ajouter.

Puisque la classe String estfinal and immutable, la fonction doit renvoyer un nouveauString avec le caractère ajouté.

2. Utilisation d'un caractèreArray

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

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

Enfin, nous construisons lesString souhaités à 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);
}

Comparé aux deux autres méthodes, il s’agit d’une approche de conception de bas niveau qui nous offre la plus grande flexibilité.

3. Utilisation de la méthodesubstring

Une approche plus simple et de niveau supérieur consiste à utiliser la méthodesubstring() de la classeString. Il prépare lesString en concaténant:

  1. La sous-chaîne desStringoriginaux avant la position

  2. Le nouveau personnage

  3. La sous-chaîne desStringd'origine 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,it has a downside in that it creates a number of temporary objects to determine the result. CommeString est une classe immuable, chaque appel à sa méthodesubstring() crée une nouvelle instanceString.

Enfin, lorsque nous concaténons les parties, le compilateur crée un objetStringBuilder pour les ajouter une par une. Chaque objetString etStringBuilder alloue des emplacements de mémoire séparés 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 avons besoin d'appeler la méthode un grand nombre de fois, les objets temporaires peuvent remplir la mémoire de tas et cela déclenchera très souvent GC. Cela peut également affecter la performance dans une certaine mesure.

4. Utilisation d'unStringBuilder

StringBuilder est une classe utilitaire fournie par la bibliothèqueJava pour construire et manipuler les objetsString de plusieurs manières.

Nous pouvons implémenter la même fonctionnalité en utilisant la méthodeinsert() de la classeStringBuilder:

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 ne doit créer qu'un seul objetStringBuilder pour insérer le caractère à la position. Il alloue la même quantité de mémoire que leString 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’unStringBuilder puisse être plus lente, elle n’a pas la charge de mémoire liée à l’initialisation des objets temporaires. We also end up with code that is simple and readable.

5. Conclusion

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

Le moyen préféré de mettre en œuvre la solution est d'utiliserthe StringBuilder class – as it’s simple, less bug-prone and offers good and stable performance.

Comme d'habitude, le code source complet du tutoriel ci-dessus est disponibleover on GitHub.