我怎样将Java中的CharSequence
转换为String
?
通过调用其toString()
方法。
返回一个包含与此序列中相同顺序的字符的字符串。 字符串的长度将是此序列的长度。
这里有一个微妙的问题,需要注意。
toString()
方法在 Object
中拥有默认实现。而 CharSequence
是一个接口;虽然 toString()
方法似乎是该接口的一部分,但是在编译时没有任何强制要求你重写它并遵守 CharSequence
的 toString()
方法 javadoc 所规定的额外约束条件,即它应返回包含按 charAt()
返回的字符顺序的字符串。
即使你创建了一个新的 CharSequence
实现,你的 IDE 也不会提醒你去重写 toString()
方法。例如,在 intellij 中,如果你创建了一个新的 CharSequence
实现,你将看到以下界面:http://puu.sh/2w1RJ。注意其中缺少 toString()
方法。
如果你依赖于任意的 CharSequence
上的 toString()
方法,假设其实现者已经做好了他们的工作,那么它应该能够正常工作。但如果你想完全避免任何不确定性,你应该使用 StringBuilder
和 append()
方法,如下所示:
final StringBuilder sb = new StringBuilder(charSequence.length());
sb.append(charSequence);
return sb.toString();
StringBuilder
也可能无法按照您的期望执行。对于任何其他接口,例如 List
或 Set
,特别是它们的 equals()
和 hashCode()
方法,虽然可以编译通过,但必须根据合同进行重写。 - shmosel您可以直接使用String.valueOf()
String.valueOf(charSequence)
尽管这与 toString()
相同,但它在实际调用 toString 之前对 charSequence
进行了空值检查。
当方法可以返回 charSequence
或 null
值时,这是有用的。
charSequence
为空,返回的字符串将是 "null"
而不是 null
。 - ChrisThomasString string = String.valueOf(charSequence);
我们可以尝试三种常见的方法来将CharSequence
转换为String
:
String string = (String) charSequence;
toString()
: String string = charSequence.toString();
String.valueOf()
方法: String string = String.valueOf(charSequence);
如果我们在CharSequence charSequence = "a simple string";
的情况下运行这些代码,则所有三者都会产生预期的结果。
问题在于当我们不确定CharSequence
的性质时会发生什么。实际上,CharSequence
是一个接口
,几个其他类实现了它,例如-String
,CharBuffer
,StringBuffer
等。因此,将String
转换为CharSequence
是一种简单的赋值操作,不需要任何强制转换或其他操作。但是,对于相反的操作,即向上转型,则不一定成立。
只有当我们确定CharSequence
实际上是String
的对象时,才能使用选项1-类型转换。否则,我们将收到ClassCastException
的错误。在这种情况下,选项2和3是安全的。
另一方面,如果CharSequence
为null
,则选项2 - 调用toString()
将产生NullPointerException
。
现在,在内部,String.valueOf()
方法在执行null
检查后调用toString()
方法。因此,它是最安全的方法。 Java文档:
如果参数为null,则返回等于“null”的字符串;否则,返回obj.toString()的值。
请注意:如果CharSequence
为null
,则String.valueOf()
方法将返回字符串- "null"
,而不是null
值。
charSequence
为null
,则new StringBuilder(charSequence).toString();
会抛出NullPointerException异常。 - Minhas Kamal如果你想将一个CharSequence数组转换成字符串数组,你可以简单地这样做,并且也可以将其存储在一个String[]变量中。
CharSequence[] textMsgs = (CharSequence[])sbm.getNotification().extras.get(Notification.EXTRA_TEXT_LINES);
if (textMsgs != null) {
for (CharSequence msg : textMsgs) {
Log.e("Msg", msg.toString());
}
}
你也可以使用 StringBuilder。
new StringBuilder(charSequence).toString();
String.valueOf(charSequence)
。这里有详细答案。 - Minhas Kamal