Jak przekonwertować znak na ciąg?

837

Mam chari potrzebuję String. Jak przekonwertować z jednego na drugi?

Landon Kuhn
źródło
187
Nie oceniany? Dlaczego miałbym zadawać tak łatwe pytanie? Ponieważ Google nie ma naprawdę oczywistego wyniku wyszukiwania tego pytania. Umieszczając to tutaj, zmienimy to.
Landon Kuhn
45
całkowicie zgadzam się z twoją opinią. Głosowałem za tym, aby pozbyć się głosów negatywnych. Mocno wierzę w ułatwianie wszystkim takim tematom Google. =)
prolink007
4
Czy twoje badania obejmowały czytanie dokumentacji klasy String?
DJClayworth,
12
@DJClayworth Na większość pytań SO można odpowiedzieć za pomocą RTFM, ale to nie jest bardzo pomocne. Dlaczego nie pozwolić głosować osobom, które znajdą to pytanie, i pozwolić, aby sprawy potoczyły się swoją drogą?
beldaz
10
@PaulBellora Tylko że StackOverflow stał się pierwszym przystankiem dla badań. Jeśli w pierwszych 10 wynikach Google jest link StackOverlfow, to tutaj.
Martin

Odpowiedzi:

642

Możesz użyć Character.toString(char). Zauważ, że ta metoda po prostu zwraca wywołanie String.valueOf(char), które również działa.

Jak zauważyli inni, konkatenacja łańcuchów znaków działa również jako skrót:

String s = "" + 's';

Ale to kompiluje się do:

String s = new StringBuilder().append("").append('s').toString();

co jest mniej wydajne, ponieważ StringBuilderjest on wspierany przez char[](nadmiernie przydzielony przez StringBuilder()to 16), tylko dla tej tablicy, która jest obronnie kopiowana przez wynikowy String.

String.valueOf(char)„dostaje się do tylnych drzwi” przez zawinięcie chartablicy jednoelementowej i przekazanie jej prywatnemu konstruktorowi pakietu String(char[], boolean), co pozwala uniknąć kopiowania tablicy.

Paul Bellora
źródło
Myślę, że skrót kompiluje się do:new StringBuilder("").append('s').toString();
Binkan Salaryman
@ BinkanSalaryman za pomocą javac 1.8.0_51-b16, a następnie javap do dekompilacji, widzę wywołania konstruktora / metody, które mam w odpowiedzi. Czego używasz?
Paul Bellora,
237

Dobre pytanie. Mam do dyspozycji pięć następujących 6 metod.

// #1
String stringValueOf = String.valueOf('c'); // most efficient

// #2
String stringValueOfCharArray = String.valueOf(new char[]{x});

// #3
String characterToString = Character.toString('c');

// #4
String characterObjectToString = new Character('c').toString();

// #5
   // Although this method seems very simple, 
   // this is less efficient because the concatenation
   // expands to new StringBuilder().append(x).append("").toString();
String concatBlankString = 'c' + "";

// #6
String fromCharArray = new String(new char[]{x});

Uwaga: Character.toString (char) zwraca String.valueOf (char) . Tak skutecznie oba są takie same.

String.valueOf(char[] value)wywołuje new String(char[] value), co z kolei ustawia valuetablicę char.

public String(char value[]) {
    this.value = Arrays.copyOf(value, value.length);
}

Z drugiej strony String.valueOf(char value)wywołuje następujący pakiet prywatny konstruktor.

String(char[] value, boolean share) {
    // assert share : "unshared not supported";
    this.value = value;
}

Kod źródłowy String.javaw języku Java kodu źródłowego 8

W związku z tym String.valueOf(char)wydaje się najbardziej efektywny sposób, zarówno w odniesieniu do pamięci i szybkość konwersji chardo String.

  1. Jak przekonwertować prymitywny znak na String w Javie
  2. Jak przekonwertować Char na String w Javie za pomocą przykładu
WarFox
źródło
50

Poniżej znajdują się różne sposoby konwersji na char c na String s (w malejącej kolejności prędkości i wydajności)

char c = 'a';
String s = String.valueOf(c);             // fastest + memory efficient
String s = Character.toString(c);
String s = new String(new char[]{c});
String s = String.valueOf(new char[]{c});
String s = new Character(c).toString();
String s = "" + c;                        // slowest + memory inefficient
sactiw
źródło
ktoś to przetestował?
Lucas Noetzold
34

Użyj Character.toString()metody w ten sposób:

char mChar = 'l';
String s = Character.toString(mChar);
Tomek
źródło
33

Użyj dowolnego z poniższych:

String str = String.valueOf('c');
String str = Character.toString('c');
String str = 'c' + "";
Wayne
źródło
17

Jak stwierdził @WarFox - istnieje 6 metod konwersji znaków na ciąg znaków. Jednak najszybszy byłby poprzez konkatenację, pomimo odpowiedzi powyżej stwierdzających, że tak jest String.valueOf. Oto punkt odniesienia, który dowodzi, że:

@BenchmarkMode(Mode.Throughput)
@Fork(1)
@State(Scope.Thread)
@Warmup(iterations = 10, time = 1, batchSize = 1000, timeUnit = TimeUnit.SECONDS)
@Measurement(iterations = 10, time = 1, batchSize = 1000, timeUnit = TimeUnit.SECONDS)
public class CharToStringConversion {

    private char c = 'c';

    @Benchmark
    public String stringValueOf() {
        return String.valueOf(c);
    }

    @Benchmark
    public String stringValueOfCharArray() {
        return String.valueOf(new char[]{c});
    }

    @Benchmark
    public String characterToString() {
        return Character.toString(c);
    }

    @Benchmark
    public String characterObjectToString() {
        return new Character(c).toString();
    }

    @Benchmark
    public String concatBlankStringPre() {
        return c + "";
    }

    @Benchmark
    public String concatBlankStringPost() {
        return "" + c;
    }

    @Benchmark
    public String fromCharArray() {
        return new String(new char[]{c});
    }
}

I wynik:

Benchmark                                        Mode  Cnt       Score      Error  Units
CharToStringConversion.characterObjectToString  thrpt   10   82132.021 ± 6841.497  ops/s
CharToStringConversion.characterToString        thrpt   10  118232.069 ± 8242.847  ops/s
CharToStringConversion.concatBlankStringPost    thrpt   10  136960.733 ± 9779.938  ops/s
CharToStringConversion.concatBlankStringPre     thrpt   10  137244.446 ± 9113.373  ops/s
CharToStringConversion.fromCharArray            thrpt   10   85464.842 ± 3127.211  ops/s
CharToStringConversion.stringValueOf            thrpt   10  119281.976 ± 7053.832  ops/s
CharToStringConversion.stringValueOfCharArray   thrpt   10   86563.837 ± 6436.527  ops/s

Jak widać, najszybszym będzie c + ""lub "" + c;

VM version: JDK 1.8.0_131, VM 25.131-b11

Ta różnica w wydajności wynika z -XX:+OptimizeStringConcatoptymalizacji. Możesz przeczytać o tym tutaj .

Dmitrij Dumański
źródło
15

Spróbuj tego: Character.toString(aChar)lub tylko tego:aChar + ""

Óscar López
źródło
4

Mamy różne sposoby konwersji charna String. Jednym ze sposobów jest użycie metody statycznej toString()w Characterklasie:

char ch = 'I'; 
String str1 = Character.toString(ch);

W rzeczywistości ta toStringmetoda wewnętrznie korzysta z valueOfmetody z Stringklasy, która korzysta z tablicy char:

public static String toString(char c) {
    return String.valueOf(c);
}

Tak więc drugim sposobem jest użycie tego bezpośrednio:

String str2 = String.valueOf(ch);

Ta valueOfmetoda w Stringklasie wykorzystuje tablicę char:

public static String valueOf(char c) {
        char data[] = {c};
        return new String(data, true);
}

Tak więc trzecia droga jest, aby korzystanie z anonimowej tablicy zawijać pojedynczy znak, a następnie przekazanie go do Stringkonstruktora:

String str4 = new String(new char[]{ch});

Czwartym sposobem jest wykorzystanie konkatenacji:

String str3 = "" + ch;

To faktycznie wykorzysta appendmetodę z StringBuilderklasy, która jest faktycznie preferowana, gdy wykonujemy konkatenację w pętli.

akhil_mittal
źródło
4

Oto kilka metod, w żadnej kolejności:

char c = 'c';

String s = Character.toString(c); // Most efficient way

s = new Character(c).toString(); // Same as above except new Character objects needs to be garbage-collected

s = c + ""; // Least efficient and most memory-inefficient, but common amongst beginners because of its simplicity

s = String.valueOf(c); // Also quite common

s = String.format("%c", c); // Not common

Formatter formatter = new Formatter();
s = formatter.format("%c", c).toString(); // Same as above
formatter.close();
HyperNeutrino
źródło
2

Konwertuję Char Array na String

Char[] CharArray={ 'A', 'B', 'C'};
String text = String.copyValueOf(CharArray);
siedmiodniowa żałoba
źródło
To nie daje odpowiedzi na pytanie. Aby skrytykować lub poprosić autora o wyjaśnienia, zostaw komentarz pod postem. - Z recenzji
pczeus
Konwertuję tablicę znaków na ciąg @pczeus
Shiva
0

Wypróbowałem te sugestie, ale ostatecznie wdrożyłem je w następujący sposób

editView.setFilters(new InputFilter[]{new InputFilter()
        {
            @Override
            public CharSequence filter(CharSequence source, int start, int end,
                                       Spanned dest, int dstart, int dend)
            {
                String prefix = "http://";

                //make sure our prefix is visible
                String destination = dest.toString();

                //Check If we already have our prefix - make sure it doesn't
                //get deleted
                if (destination.startsWith(prefix) && (dstart <= prefix.length() - 1))
                {
                    //Yep - our prefix gets modified - try preventing it.
                    int newEnd = (dend >= prefix.length()) ? dend : prefix.length();

                    SpannableStringBuilder builder = new SpannableStringBuilder(
                            destination.substring(dstart, newEnd));
                    builder.append(source);
                    if (source instanceof Spanned)
                    {
                        TextUtils.copySpansFrom(
                                (Spanned) source, 0, source.length(), null, builder, newEnd);
                    }

                    return builder;
                }
                else
                {
                    //Accept original replacement (by returning null)
                    return null;
                }
            }
        }});
zmicer
źródło