← Back Home

How to convert primitive char to String in Java

char is 16 bit unsigned data type in Java, which is used to store characters and String value is an immutable array of char. In Java we cannot cast a primitive char element to String.

tl;dr

6 Ways to do it

Below I have given five 6 methods to convert a char to String. Also I have included common mistakes that gives compile time errors.

package com.deepumohan.tech.chartostring;

public class CharToString {

    public static void main(String[] args) {
        char x = 'x';

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

        // use String.valueOf(char) static method
        String stringValueOf = String.valueOf(x);

        // use String.valueOf(char[]) static method
        String stringValueOfCharArray = String.valueOf(new char[]{x});

        // use Character.toString(char) static method
        String characterToString = Character.toString(x);

        // create new Character object from the given char and
        // then use object's toString() method
        String characterObjectToString = new Character(x).toString();

        // create new char[] array from the char and pass it to
        // String constructor
        String fromCharArray = new String(new char[]{x});

        System.out.println(concatBlankString + ":" + stringValueOf + ":" + stringValueOfCharArray);
        System.out.println(characterToString + ":" + characterObjectToString + ":" + fromCharArray);

        /*
        // Compile time error
        // No suitable constructor found
        public static String noConstructor(char x) {
            return new String(x);
        }
        // Compile time error
        // Inconvertible types
        public static String inconvertibleTypes(char x) {
            return (String) x;
        }
        */

    }

}

EDIT: September 07 2015

Closer look on what is happening in Java 8

Source codes are extracted from grepcode Open JDK 8

The toString methods in java.lang.Character class calls the String.valueOf(char) method.

package java.lang.Character;

...

public String toString() {
    char buf[] = {value};
    return String.valueOf(buf);
}

...

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

And here is what String.valueOf(char[]) and String.valueOf(char) methods looks like.

package java.lang.String;

...

/**
 * Returns the string representation of the {@code char} array
 * argument. The contents of the character array are copied; subsequent
 * modification of the character array does not affect the returned
 * string.
 *
 * @param   data     the character array.
 * @return  a {@code String} that contains the characters of the
 *          character array.
 */
public static String valueOf(char data[]) {
    return new String(data);
}

...

/**
 * Returns the string representation of the {@code char}
 * argument.
 *
 * @param   c   a {@code char}.
 * @return  a string of length {@code 1} containing
 *          as its single character the argument {@code c}.
 */
public static String valueOf(char c) {
    char data[] = {c};
    return new String(data, true); // package private
}

Here are the constructors that is called in the above methods.

package java.lang.String;

...

/**
 * Allocates a new {@code String} so that it represents the sequence of
 * characters currently contained in the character array argument. The
 * contents of the character array are copied; subsequent modification of
 * the character array does not affect the newly created string.
 *
 * @param  value
 *         The initial value of the string
 */
public String(char value[]) {
    this.value = Arrays.copyOf(value, value.length);
}

...

/*
* Package private constructor which shares value array for speed.
* this constructor is always expected to be called with share==true.
* a separate constructor is needed because we already have a public
* String(char[]) constructor that makes a copy of the given char[].
*/
String(char[] value, boolean share) {
    // assert share : "unshared not supported";
    this.value = value;
}

To summarise when you use String.valueOf or Charactor.toString methods, the constructor public String(char value[]) is being invoked. You may as well call it directly and reduce one hop.

Most Efficient Method

String.valueOf(char value) invokes the following package private constructor.

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

String.valueOf(char) seems to be most efficient method for converting char to String.

Side note

Remember String objects are immutable and they can be shared.

For example:

    String str = "abc";

is equivalent to:

     char data[] = {'a', 'b', 'c'};
     String str = new String(data);

I wonder why Java doesn’t include String constructor that accept a single char as argument.

Java does’nt include String constructor that accepts a single char, because there already is a constructor that accepts a char[].

Also see

comments powered by Disqus