Hinzufügen eines Zeichens zu einer Zeichenfolge an einer bestimmten Position

Hinzufügen eines Zeichens zu einer Zeichenfolge an einer bestimmten Position

1. Einführung

In diesem kurzen Tutorial werden wirdemonstrate how to add a character at any given position in a String in Java.

Wir werden drei Implementierungen einer einfachen Funktion vorstellen, die das ursprünglicheString, als Zeichen und die Position verwendet, an der wir es hinzufügen müssen.

Da die String-Klassefinal and immutable ist, sollte die Funktion ein neuesString mit dem hinzugefügten Zeichen zurückgeben.

2. Verwenden eines ZeichensArray

Hier besteht die Idee darin, ein neues Zeichenarray zu erstellen und die Zeichen aus den ursprünglichenString vor der angegebenen Position zu kopieren.

Danach setzen wir das neue Zeichen an die Position und kopieren die restlichen Zeichen aus den ursprünglichenString an die nachfolgenden Positionen des neuen Arrays.

Schließlich konstruieren wir die gewünschtenString aus diesem Array.

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);
}

Im Vergleich zu den beiden anderen Methoden handelt es sich um einen einfachen Entwurfsansatz, der uns die größte Flexibilität bietet.

3. Verwenden dersubstring-Methode

Ein einfacherer und übergeordneter Ansatz besteht darin, die Methodesubstring()der KlasseStringzu verwenden. Es bereitet dieString durch Verketten vor:

  1. Der Teilstring des ursprünglichenString vor der Position

  2. Der neue Charakter

  3. Der Teilstring des ursprünglichenString nach der Position

public String addChar(String str, char ch, int position) {
    return str.substring(0, position) + ch + str.substring(position);
}

Obwohl der obige Code besser lesbar ist,it has a downside in that it creates a number of temporary objects to determine the result. DaString eine unveränderliche Klasse ist, erstellt jeder Aufruf seinersubstring()-Methode eine neueString-Instanz.

Wenn wir die Teile verketten, erstellt der Compiler schließlich einStringBuilder-Objekt, um sie einzeln anzuhängen. JedesString- undStringBuilder-Objekt weist seinem internen Zeichenarray separate Speicherorte zu.

Diese Implementierung muss auch alle Zeichen dreimal von einem Array in ein anderes kopieren.

Wenn die Methode sehr oft aufgerufen werden muss, füllen die temporären Objekte möglicherweise den Heap-Speicher. Dadurch wird die GC sehr häufig ausgelöst. Dies kann in gewissem Maße auch die Leistung beeinträchtigen.

4. Verwenden vonStringBuilder

StringBuilder ist eine Dienstprogrammklasse, die von der Bibliothek vonJavabereitgestellt wird, umString Objekte auf verschiedene Arten zu erstellen und zu bearbeiten.

Wir können dieselbe Funktionalität mit derinsert()-Methode derStringBuilder-Klasse implementieren:

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

Der obige Code muss nur ein einzelnesStringBuilder-Objekt erstellen, um das Zeichen an der Position einzufügen. Es weist dieselbe Speichermenge zu, die das ursprünglicheString hat, aber um einen Platz für das neue Zeichen zu schaffen, verschiebt das zugrunde liegende Array die nächsten Zeichen um 1 Position.

Die Verwendung vonStringBuilder ist zwar möglicherweise langsamer, hat jedoch nicht die Speicherlast für die Initialisierung temporärer Objekte. We also end up with code that is simple and readable.

5. Fazit

In diesem Artikel haben wir uns auf verschiedene Möglichkeiten konzentriert, ein Zeichen in einString-Objekt inJava einzufügen. Wir haben gesehen, dass die Implementierung mit einem Zeichenarray die beste Leistung bietet und dass mit dersubstring-Methode ein besser lesbarer Ansatz erzielt wird.

Die bevorzugte Methode zur Implementierung der Lösung ist die Verwendung vonthe StringBuilder class – as it’s simple, less bug-prone and offers good and stable performance.

Wie üblich ist der vollständige Quellcode für das obige Tutorialover on GitHub verfügbar.