Nasıl bir karakter bir String dönüştürmek için?


837

Benim bir charve ihtiyacım var String. Birinden diğerine nasıl dönüştürebilirim?


187
Downvoted? Neden bu kadar kolay bir soru sormalıyım? Çünkü Google'ın bu soru için çok açık bir arama sonucu yok. Bunu buraya koyarak bunu değiştireceğiz.
Landon Kuhn

45
Fikrinize tamamen katılıyorum. Olumsuz oylardan kurtulmak için buna oy verdim. Böyle googling konularını herkes için daha kolay hale getireceğime inanıyorum. =)
prolink007

4
Araştırmanız String sınıfı belgelerini okumayı içeriyor mu?
DJClayworth

12
@DJClayworth SO sorularının çoğu RTFM ile cevaplanabilir, ancak bu çok yararlı değildir. Soruyu bulan kişilerin soruyu gözden geçirmesine ve işlerin yoluna girmesine neden izin vermiyorsun?
beldaz

10
@ PaulBellora Sadece StackOverflow araştırma için ilk durak oldu. Buradaki ilk 10 Google Sonuçları'nda bir StackOverlfow bağlantısı varsa.
Martin

Yanıtlar:


642

Kullanabilirsiniz Character.toString(char). Bu yöntemin sadece bir çağrıyı döndürdüğünü String.valueOf(char)ve bunun da işe yaradığını unutmayın.

Diğerlerinin de belirttiği gibi, dize birleştirme de kısayol olarak çalışır:

String s = "" + 's';

Ancak bu, aşağıdakilere kadar derlenir:

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

çünkü daha az verimli olan StringBuilderbir ile desteklenmektedir char[](göre aşırı tahsis StringBuilder()etmek 16,) Sadece bu dizi savunmaya elde edilen tarafından kopyalanması için String.

String.valueOf(char)"arka kapıya girer", chartek öğeli bir diziye sarılarak String(char[], boolean)ve dizinin kopyalanmasını önleyen paket özel yapıcısına iletilir.


Kısayol aşağı derler düşünüyorum:new StringBuilder("").append('s').toString();
Binkan Salaryman

@BinkanSalaryman javac 1.8.0_51-b16 kullanarak ve sonra javap decompile için, ben cevapta yapıcı / yöntem çağrıları görüyorum. Ne kullanıyorsun?
Paul Bellora

237

Güzel soru. Bunu yapmak için aşağıdaki beş 6 yöntemden birini aldım .

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

Not: Character.toString (char) , String.valueOf (char) değerini döndürür . Yani etkili bir şekilde her ikisi de aynı.

String.valueOf(char[] value)çağırır new String(char[] value), bu da valuechar dizisini ayarlar .

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

Öte yandan String.valueOf(char value)aşağıdaki paket özel kurucu çağırır .

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

Kaynak kodu String.javaiçinde Java 8 kaynak kodu

Bu nedenle String.valueOf(char), hem bellek hem de hız açısından dönüştürmek chariçin en etkili yöntem gibi görünüyor String.

  1. İlkel karakter Java dize nasıl dönüştürülür
  2. Char ile Java Java String örnek ile dönüştürme

50

Aşağıda char c'yi String s'e dönüştürmenin çeşitli yolları vardır (azalan hız ve verimlilik sırasıyla)

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

birisi bunu test etti mi?
Lucas Noetzold

34

Character.toString()Aşağıdaki gibi yöntemi kullanın :

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

33

Aşağıdakilerden herhangi birini kullanın:

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

17

@WarFox'un belirttiği gibi - char'ı dizeye dönüştürmek için 6 yöntem vardır. Bununla birlikte, en hızlı olanı, yukarıda belirtilen cevaplara rağmen, birleştirme yoluyla olacaktır String.valueOf. İşte bunu kanıtlayan kriter:

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

Ve sonuç:

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

Gördüğünüz gibi, en hızlısı c + ""veya "" + c;

VM version: JDK 1.8.0_131, VM 25.131-b11

Bu performans farkı -XX:+OptimizeStringConcatoptimizasyondan kaynaklanmaktadır . Burada okuyabilirsiniz .



4

Biz dönüştürmek için çeşitli yollar vardır chariçin String. Tek yönlü statik yöntemin yapmak kullanımı için toString()de Charactersınıfta:

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

Aslında bu toStringyöntem valueOf, Stringsınıftan char dizisini kullanan yöntemi kullanır:

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

Yani ikinci yolu doğrudan bu kullanmaktır:

String str2 = String.valueOf(ch);

Sınıftaki bu valueOfyöntem Stringchar dizisini kullanır:

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

Yani üçüncü bir yol yapmaktır anonim dizinin kullanılması geçirmeden sonra tek bir karakter sarın ve Stringyapıcı:

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

Dördüncü yolu birleştirme yapmak kullanımına geçerli:

String str3 = "" + ch;

Bu aslında bir döngüde birleştirme yaparken aslında tercih edilen sınıftan bir appendyöntem kullanacaktır StringBuilder.


4

İşte belirli bir sırayla birkaç yöntem:

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

Char Array'ı String'e dönüştürüyorum

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

Bu soruya bir cevap sağlamaz. Bir yazardan eleştiri veya açıklama istemek için gönderilerinin altına bir yorum bırakın. - Yorumdan
pczeus

Char Array'ı String @pczeus'a Dönüştürüyorum
Shiva

0

Önerileri denedim, ancak aşağıdaki gibi uyguladım

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;
                }
            }
        }});
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.