Jak przekonwertować znak na ciąg?


837

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


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.


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

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

ktoś to przetestował?
Lucas Noetzold

34

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

char mChar = 'l';
String s = Character.toString(mChar);

33

Użyj dowolnego z poniższych:

String str = String.valueOf('c');
String str = Character.toString('c');
String str = 'c' + "";

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 .



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.


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

2

Konwertuję Char Array na String

Char[] CharArray={ 'A', 'B', 'C'};
String text = String.copyValueOf(CharArray);

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;
                }
            }
        }});
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.