How to convert CharSequence to String?
How can I convert a Java CharSequence
to a String
?
Solution 1:
By invoking its toString()
method.
Returns a string containing the characters in this sequence in the same order as this sequence. The length of the string will be the length of this sequence.
Solution 2:
There is a subtle issue here that is a bit of a gotcha.
The toString()
method has a base implementation in Object
. CharSequence
is an interface; and although the toString()
method appears as part of that interface, there is nothing at compile-time that will force you to override it and honor the additional constraints that the CharSequence
toString()
method's javadoc puts on the toString()
method; ie that it should return a string containing the characters in the order returned by charAt()
.
Your IDE won't even help you out by reminding that you that you probably should override toString()
. For example, in intellij, this is what you'll see if you create a new CharSequence
implementation: http://puu.sh/2w1RJ. Note the absence of toString()
.
If you rely on toString()
on an arbitrary CharSequence
, it should work provided the CharSequence
implementer did their job properly. But if you want to avoid any uncertainty altogether, you should use a StringBuilder
and append()
, like so:
final StringBuilder sb = new StringBuilder(charSequence.length());
sb.append(charSequence);
return sb.toString();
Solution 3:
You can directly use String.valueOf()
String.valueOf(charSequence)
Though this is same as toString()
it does a null check on the charSequence
before actually calling toString.
This is useful when a method can return either a charSequence
or null
value.
Solution 4:
The Safest Way
String string = String.valueOf(charSequence);
Let's Dive Deep
There are 3 common ways that we can try to convert a CharSequence
to String
:
-
Type Casting:
String string = (String) charSequence;
-
Calling
toString()
:String string = charSequence.toString();
-
String.valueOf()
Method:String string = String.valueOf(charSequence);
And if we run these where CharSequence charSequence = "a simple string";
then all 3 of them will produce the expected result.
The problem happens when we are not sure about the nature of the CharSequence
. In fact, CharSequence
is an interface
that several other classes implement, like- String
, CharBuffer
, StringBuffer
, etc. So, converting a String
to a CharSequence
is a straightforward assignment operation, no casting or anything is required. But, for the opposite, Upcasting, it is not true.
If we are sure that the CharSequence
is actually an object of String
, only then we can use option 1- Type Casting. Otherwise, we will get a ClassCastException
. Option 2 and 3 are safe in this case.
On the other side, if the CharSequence
is null
then option 2, Calling toString()
, will give a NullPointerException
.
Now internally, String.valueOf()
method calls the toString()
method after doing a null
check. So, it is the safest way. JavaDoc:
if the argument is null, then a string equal to "null"; otherwise, the value of obj.toString() is returned.
Please be aware: If CharSequence
is null
then String.valueOf()
method return the string- "null"
, not null
value.