Como converter um char para uma String?


837

Eu tenho um chare preciso de um String. Como faço para converter de um para o outro?


187
Votado? Por que eu faria uma pergunta tão fácil? Porque o Google não possui um resultado de pesquisa realmente óbvio para esta pergunta. Ao colocar isso aqui, mudaremos isso.
Landon Kuhn

45
Eu concordo completamente com sua opinião. Votei isso para se livrar do voto negativo. Acredito firmemente em facilitar a pesquisa em tópicos como esse no Google. =)
prolink007 17/11

4
Sua pesquisa incluiu a leitura da documentação da classe String?
quer

12
@DJClayworth A maioria das perguntas sobre SO pode ser respondida com RTFM, mas isso não ajuda muito. Por que não deixar que as pessoas que acham a pergunta a votem e deixem as coisas seguirem seu curso?
22813 beldaz

10
@PaulBellora Somente o StackOverflow se tornou a primeira parada para pesquisas. Se houver um link StackOverlfow nos 10 primeiros resultados do Google aqui.
Martin Martin

Respostas:


642

Você pode usar Character.toString(char). Observe que esse método simplesmente retorna uma chamada para String.valueOf(char), o que também funciona.

Como outros observaram, a concatenação de strings também funciona como um atalho:

String s = "" + 's';

Mas isso se resume a:

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

o que é menos eficiente porque StringBuilderé apoiado por um char[](superalocado por StringBuilder()para 16), apenas para que essa matriz seja copiada defensivamente pelo resultado String.

String.valueOf(char)"entra pela porta dos fundos" envolvendo a charmatriz em um único elemento e passando-a para o construtor privado do pacote String(char[], boolean), o que evita a cópia da matriz.


Eu acho que o atalho compila para baixo:new StringBuilder("").append('s').toString();
Binkan Salaryman

@BinkanSalaryman usando javac 1.8.0_51-b16 e, em seguida, javap para descompilar, vejo as chamadas de construtor / método que tenho na resposta. O que você está usando?
Paul Bellora 24/07

237

Boa pergunta. Eu tenho os seguintes cinco 6 métodos para fazê-lo.

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

Nota: Character.toString (char) retorna String.valueOf (char) . Tão efetivamente os dois são iguais.

String.valueOf(char[] value)chama new String(char[] value), que por sua vez define a valuematriz char.

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

Por outro lado, String.valueOf(char value)invoca o seguinte construtor privado de pacotes.

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

O código-fonte a partir String.javade Java de código fonte 8

Portanto, String.valueOf(char)parece ser o método mais eficiente, em termos de memória e velocidade, para a conversão charpara String.

  1. Como converter char primitivo para String em Java
  2. Como converter Char para String em Java com Exemplo

50

Abaixo estão várias maneiras de converter para char c em String s (em ordem decrescente de velocidade e eficiência)

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

alguém testou isso?
Lucas Noetzold 21/04

34

Use o Character.toString()método da seguinte maneira:

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

33

Use qualquer um dos seguintes:

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

17

Como @WarFox afirmou - existem 6 métodos para converter char em string. No entanto, o mais rápido seria via concatenação, apesar das respostas acima afirmando que é String.valueOf. Aqui está uma referência que prova que:

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

E resultado:

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

Como você pode ver, o mais rápido seria c + ""ou "" + c;

VM version: JDK 1.8.0_131, VM 25.131-b11

Essa diferença de desempenho é devido à -XX:+OptimizeStringConcatotimização. Você pode ler sobre isso aqui .



4

Temos várias maneiras de converter um charpara String. Uma maneira é fazer uso do método estático toString()na Characterclasse:

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

Na verdade, este toStringmétodo utiliza internamente o valueOfmétodo da Stringclasse que faz uso da matriz char:

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

Então, a segunda maneira é usar isso diretamente:

String str2 = String.valueOf(ch);

Este valueOfmétodo na Stringclasse faz uso da matriz char:

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

Portanto, a terceira maneira é usar uma matriz anônima para quebrar um único caractere e depois passá-lo ao Stringconstrutor:

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

A quarta maneira é fazer uso da concatenação:

String str3 = "" + ch;

Isso realmente fará uso do appendmétodo da StringBuilderclasse que é realmente preferido quando estivermos fazendo concatenação em um loop.


4

Aqui estão alguns métodos, em nenhuma ordem específica:

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

Estou convertendo Char Array para String

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

Isso não fornece uma resposta para a pergunta. Para criticar ou solicitar esclarecimentos a um autor, deixe um comentário abaixo da postagem. - Do comentário
pczeus

Eu estou convertendo Char matriz para String @pczeus
Shiva

0

Eu tentei as sugestões, mas acabei implementando da seguinte forma

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;
                }
            }
        }});
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.