Wie konvertiere ich ein char-Array zurück in einen String?


405

Ich habe ein char-Array:

char[] a = {'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd'};

Meine aktuelle Lösung ist zu tun

String b = new String(a);

Aber gibt es doch einen besseren Weg, dies zu tun?


151
Warum denkst du, dass es einen besseren Weg gibt? Und nenn mich nicht Shirley. :)
Luftkissenfahrzeug voller Aale

Weil ich immer assoziiere, neue Variablen wie die oben genannten zu erstellen, um zur Laufzeit einen leichten Overhead zu haben. Wenn ich zum Beispiel die obige Zeile setze, um ein char-Array in einen String in eine for-Schleife umzuwandeln, sieht es für mich nicht ganz richtig aus. Und ja, ich bin ein bisschen ein Perfektionist. . .
Chutsu

1
Wenn Sie viele dieser Leute haben, sagen wir ein Array oder eine Sammlung von char [], dann würden Sie die char-Arrays vielleicht an einen StringBuffer anhängen, aber für einen String hier oder da ist das, was Sie gepostet haben, das, was Sie am meisten verwenden.
Luftkissenfahrzeug voller Aale

Wenn Sie nach einer Möglichkeit suchen, das Kopieren des Zeichens [] zu vermeiden, gibt es keine. Andernfalls könnten Sie die Unveränderlichkeit von String untergraben.
Paul Cager

13
"Neue Variablen erstellen" verursacht keinen Overhead. Eine Variable ist ein Name, der verwendet wird, um auf einen Wert zu verweisen, und der Name selbst ist zur Laufzeit nirgendwo im Speicher vorhanden (zumindest nicht in einer Sprache wie Java, in der die Reflexion ziemlich begrenzt ist). Der "Overhead" ergibt sich aus der Erstellung eines neuen Werts , und daran führt in Ihrem Fall kein Weg vorbei, wenn man bedenkt, dass Ihr Problem darin besteht, "diesen Wert zu erstellen". Sie können nicht bewirken, dass das char-Array auf magische Weise in einen String umgewandelt wird. Sie können dafür sorgen, dass das ursprüngliche char-Array nach dem Erstellen des Strings mit Müll gesammelt wird.
Karl Knechtel

Antworten:


212

Nein, diese Lösung ist absolut korrekt und sehr minimal.

Beachten Sie jedoch, dass dies eine sehr ungewöhnliche Situation ist: Da Stringspeziell in Java gehandhabt wird, ist sogar "foo"tatsächlich eineString . Daher charist es im normalen Code nicht erforderlich , einen String in einzelne s aufzuteilen und wieder zusammenzufügen.

Vergleichen Sie dies mit C / C ++, wo "foo"Sie ein Bündel von chars haben, das auf der einen und stringder anderen Seite durch ein Null-Byte abgeschlossen ist, und viele Konvertierungen zwischen ihnen aufgrund älterer Methoden.


146

String text = String.copyValueOf(data);

oder

String text = String.valueOf(data);

ist wohl besser (kapselt den new StringAnruf).


6
Beide Methoden rufen String(char[])oder eine Variante davon auf. Und der Kopierteil ist innen erledigt String(char[]). Dies lässt neben der Symmetrie mit den anderen valueOfMethoden keinen Vorteil für einen direkten Aufruf .
AH

1
statisch und mehr OOP ist ein Widerspruch zu Begriffen. Alles, was als statisch deklariert wird, ist kein Teil eines Objekts oder seines Verhaltens und daher nicht objektorientiert. Abgesehen davon - wenn die Möglichkeit besteht, dass die Implementierung von Stringinkompatibel geändert und / oder erweitert wird oder mehrere konkurrierende Implementierungen zur Laufzeit ausgewählt werden können, ist eine statische Factory-Methode sinnvoll. Dies wird bei so niedrigen Levels wie nicht passieren String. Daher gehe ich davon aus: Verwenden Sie den kleinsten geeigneten Hammer, nicht den größten verfügbaren.
AH

@AH Das weiß ich nicht. String machte StringBuffer Platz, was StringBuilder Platz machte. Ich wette, die Befürworter von StringBuffer haben damals dasselbe gesagt und müssen jetzt den Code umgestalten, um StringBuilder verwenden zu können.
CorsiKa

1
@AH Die Tatsache, dass sie die CharSequenceBenutzeroberfläche erstellen mussten, zeigt, wie fehlerhaft Ihr "nicht mit Low-Level-Sachen wie String" passiert - sie ändern nicht, was in String passiert, weil sie sich früh daran gebunden haben, und jetzt wünschen sie es das hätten sie nicht.
CorsiKa

1
@corsiKa Ich habe nicht gesagt, dass die String-API alle gut und golden ist. Nur, dass es sich nicht inkompatibel ändert und dass die Klasse selbst und ihre Konstruktoren nirgendwo hingehen. :-)
AH

37

Dadurch wird das char-Array wieder in einen String konvertiert:

char[] charArray = {'a', 'b', 'c'};
String str = String.valueOf(charArray);

14
String str = "wwwwww3333dfevvv";
char[] c = str.toCharArray();

Um das Zeichenarray in einen String umzuwandeln, gibt es zwei Möglichkeiten.

Arrays.toString(c);

Gibt die Zeichenfolge zurück [w, w, w, w, w, w, 3, 3, 3, 3, d, f, e, v, v, v].

Und:

String.valueOf(c)

Gibt die Zeichenfolge zurück wwwwww3333dfevvv.

Zusammenfassend : Achten Sie darauf Arrays.toString(c), denn Sie erhalten "[w, w, w, w, w, w, 3, 3, 3, 3, d, f, e, v, v, v]"statt "wwwwww3333dfevvv".


7

Ein String in Java ist lediglich ein Objekt um ein Array von Zeichen. Daher a

char[]

ist identisch mit einem String ohne Box mit denselben Zeichen. Durch Erstellen eines neuen Strings aus Ihrem Zeichenfeld

new String(char[])

Sie weisen den Compiler im Wesentlichen an, ein String-Objekt um Ihr Zeichenarray herum automatisch zu boxen.



2
package naresh.java;

public class TestDoubleString {

    public static void main(String args[]){
        String str="abbcccddef";    
        char charArray[]=str.toCharArray();
        int len=charArray.length;

        for(int i=0;i<len;i++){
            //if i th one and i+1 th character are same then update the charArray
            try{
                if(charArray[i]==charArray[i+1]){
                    charArray[i]='0';                   
                }}
                catch(Exception e){
                    System.out.println("Exception");
                }
        }//finally printing final character string
        for(int k=0;k<charArray.length;k++){
            if(charArray[k]!='0'){
                System.out.println(charArray[k]);
            }       }
    }
}

Während dieser Code die Frage möglicherweise beantwortet, verbessert die Bereitstellung eines zusätzlichen Kontexts darüber, warum und / oder wie dieser Code die Frage beantwortet, ihren langfristigen Wert.
Baikho

1
 //Given Character Array 
  char[] a = {'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd'};


    //Converting Character Array to String using String funtion     
    System.out.println(String.valueOf(a));
    //OUTPUT : hello world

Konvertieren eines bestimmten Array-Typs in einen String mithilfe der Java 8 Stream-Funktion

String stringValue = 
Arrays.stream(new char[][]{a}).map(String::valueOf).collect(Collectors.joining());

1

Versuchen Sie zu verwenden java.util.Arrays. Dieses Modul verfügt über eine Reihe nützlicher Methoden, die im Zusammenhang mit Arrays verwendet werden können.

Arrays.toString(your_array_here[]);


0

Verwenden Sie einfach String.value wie unten;

  private static void h() {

        String helloWorld = "helloWorld";
        System.out.println(helloWorld);

        char [] charArr = helloWorld.toCharArray();

        System.out.println(String.valueOf(charArr));
    }

-3

Versuche dies:

CharSequence[] charArray = {"a","b","c"};

for (int i = 0; i < charArray.length; i++){
    String str = charArray.toString().join("", charArray[i]);
    System.out.print(str);
}

-4

Sie können auch die StringBuilder-Klasse verwenden

String b = new StringBuilder(a).toString();

Die Verwendung von String oder StringBuilder hängt von Ihren Methodenanforderungen ab.


Warum allerdings? Was bekommen Sie davon?
Casey

-12

Ein alternativer Weg ist:

String b = a + "";

3
Dies ist falsch, da davon ausgegangen wird, dass dies toStringordnungsgemäß funktioniert char[]. Es funktioniert möglicherweise bei bestimmten Anbietern und Versionen der JVM.
Fommil

3
Da die String-Klasse unveränderlich ist, werden zwei Operationen ausgeführt: toString () -Aufruf aund Erstellung eines anderen String-Objekts, das mit a.toString()und""
Alpay
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.