¿Cómo convertir un char en una cadena?

837

Tengo un chary necesito un String. ¿Cómo me convierto de uno a otro?

Landon Kuhn
fuente
187
¿Votado abajo? ¿Por qué haría una pregunta tan fácil? Porque Google carece de un resultado de búsqueda realmente obvio para esta pregunta. Al poner esto aquí, cambiaremos eso.
Landon Kuhn
45
Estoy totalmente de acuerdo con su opinión. He votado esto para deshacerme del voto negativo. Creo firmemente en hacer que googlear temas como este sea más fácil para todos. =)
prolink007
44
¿Su investigación incluyó la lectura de la documentación de la clase String?
DJClayworth
12
@DJClayworth La mayoría de las preguntas de SO podrían responderse con RTFM, pero eso no es muy útil. ¿Por qué no dejar que las personas que encuentran la pregunta lo voten y dejar que las cosas sigan su curso?
beldaz
10
@PaulBellora Solo que StackOverflow se ha convertido en la primera parada para la investigación. Si hay un enlace StackOverlfow en los primeros 10 resultados de Google, vengo aquí.
Martin

Respuestas:

642

Puedes usar Character.toString(char). Tenga en cuenta que este método simplemente devuelve una llamada a String.valueOf(char), que también funciona.

Como otros han señalado, la concatenación de cadenas también funciona como un atajo:

String s = "" + 's';

Pero esto se resume en:

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

que es menos eficiente porque StringBuilderestá respaldado por un char[](sobreasignado por StringBuilder()to 16), solo para que esa matriz sea copiada defensivamente por el resultado String.

String.valueOf(char)"entra por la puerta trasera" al envolverlo charen una matriz de un solo elemento y pasarlo al constructor privado del paquete String(char[], boolean), lo que evita la copia de la matriz.

Paul Bellora
fuente
Creo que el atajo se resume en:new StringBuilder("").append('s').toString();
Binkan Salaryman
@BinkanSalaryman usando javac 1.8.0_51-b16 y luego javap para descompilar, veo las llamadas al constructor / método que tengo en la respuesta. ¿Que estas usando?
Paul Bellora
237

Buena pregunta. Tengo los siguientes cinco 6 métodos para hacerlo.

// #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) devuelve String.valueOf (char) . Así que efectivamente ambos son iguales.

String.valueOf(char[] value)invoca new String(char[] value), que a su vez establece la valuematriz de caracteres.

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

Por otro lado String.valueOf(char value)invoca el siguiente paquete constructor privado.

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

El código fuente de String.javaen Java de código fuente 8

Por lo tanto, String.valueOf(char)parece ser el método más eficiente, tanto en términos de memoria como de velocidad, para convertir chara String.

  1. Cómo convertir caracteres primitivos a cadenas en Java
  2. Cómo convertir Char a String en Java con un ejemplo
WarFox
fuente
50

A continuación se muestran varias formas de convertir de char a String s (en orden decreciente de velocidad y eficiencia)

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
fuente
alguien probó esto?
Lucas Noetzold
34

Use el Character.toString()método de esta manera:

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

Use cualquiera de los siguientes:

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

Como dijo @WarFox: hay 6 métodos para convertir char en cadena. Sin embargo, el más rápido sería a través de la concatenación, a pesar de las respuestas anteriores que indican que es así String.valueOf. Aquí hay un punto de referencia que demuestra 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});
    }
}

Y 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 puede ver, el más rápido sería c + ""o "" + c;

VM version: JDK 1.8.0_131, VM 25.131-b11

Esta diferencia de rendimiento se debe a la -XX:+OptimizeStringConcatoptimización. Puedes leer sobre esto aquí .

Dmitriy Dumanskiy
fuente
15

Prueba esto: Character.toString(aChar)o solo esto:aChar + ""

Óscar López
fuente
4

Tenemos varias formas de convertir un chara String. Una forma es hacer uso del método estático toString()en Characterclase:

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

En realidad, este toStringmétodo utiliza internamente el valueOfmétodo de la Stringclase que hace uso de la matriz char:

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

Entonces, la segunda forma es usar esto directamente:

String str2 = String.valueOf(ch);

Este valueOfmétodo en Stringclase hace uso de la matriz de caracteres:

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

Entonces, la tercera forma es hacer uso de una matriz anónima para envolver un solo carácter y luego pasarlo al Stringconstructor:

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

La cuarta forma es hacer uso de la concatenación:

String str3 = "" + ch;

En realidad, esto hará uso del appendmétodo de la StringBuilderclase, que es realmente preferido cuando hacemos concatenación en un bucle.

akhil_mittal
fuente
4

Aquí hay algunos métodos, sin ningún orden en particular:

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();
Hiperneutrino
fuente
2

Estoy convirtiendo Char Array en String

Char[] CharArray={ 'A', 'B', 'C'};
String text = String.copyValueOf(CharArray);
Shiva
fuente
Esto no proporciona una respuesta a la pregunta. Para criticar o solicitar una aclaración de un autor, deje un comentario debajo de su publicación. - De la opinión
pczeus
Estoy convirtiendo Char Array en String @pczeus
Shiva
0

He probado las sugerencias pero terminé implementándolo de la siguiente manera

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
fuente