如何将CharSequence转换为String?

246

我怎样将Java中的CharSequence转换为String


最安全的方式:String.valueOf(charSequence)这里有详细答案 - Minhas Kamal
6个回答

389

通过调用其toString()方法。

返回一个包含与此序列中相同顺序的字符的字符串。 字符串的长度将是此序列的长度。


1
@TheOnlyAnil,也许你应该把这个作为一个问题来问。在与问题相关性不大的答案下评论并不是一个好的地方来梳理你的需求。 - Mike Samuel
Stackoverflow不让我发布任何问题。:/ 顺便说一下,我昨晚做了那个。自定义操作栏是解决方案 :) - TheOnlyAnil
1
通过使用toString()方法,我的CharSequence显示为"[Ljava.lang.CharSequence;@26ae880a",而不是实际发送的文本。toString()方法无法正常工作。 - Anton
1
@WillByers 那个输出看起来像是 CharSequence 数组的 toString,而不是 CharSequence。 - Mike Samuel
1
@Hibbem 别人已经替你做了 ;-) - logi-kal
显示剩余4条评论

92

这里有一个微妙的问题,需要注意。

toString() 方法在 Object 中拥有默认实现。而 CharSequence 是一个接口;虽然 toString() 方法似乎是该接口的一部分,但是在编译时没有任何强制要求你重写它并遵守 CharSequencetoString() 方法 javadoc 所规定的额外约束条件,即它应返回包含按 charAt() 返回的字符顺序的字符串。

即使你创建了一个新的 CharSequence 实现,你的 IDE 也不会提醒你去重写 toString() 方法。例如,在 intellij 中,如果你创建了一个新的 CharSequence 实现,你将看到以下界面:http://puu.sh/2w1RJ。注意其中缺少 toString() 方法。

如果你依赖于任意的 CharSequence 上的 toString() 方法,假设其实现者已经做好了他们的工作,那么它应该能够正常工作。但如果你想完全避免任何不确定性,你应该使用 StringBuilderappend() 方法,如下所示:

final StringBuilder sb = new StringBuilder(charSequence.length());
sb.append(charSequence);
return sb.toString();

12
因为别人可能犯错,所以你不应该因此而犯错或使你的代码变得更糟。 - Lodewijk
10
"return new StringBuilder(charSequence).toString();" 这一行代码可以简化成一行,意思不变。 - Gábor Lipták
33
这个答案是错误的。CharSequence接口明确定义了toString()方法,实现者不会忽略这一点。Java文档中指出,“返回一个字符串,其中包含与此序列中相同顺序的字符。该字符串的长度将是此序列的长度”,自1.4版本起就一直存在。请大家在点赞之前仔细核实。 - earcam
4
这很可笑。如果你不相信实现者能够遵循合同,那么一切都无法保证。将其作为参数传递给 StringBuilder 也可能无法按照您的期望执行。对于任何其他接口,例如 ListSet,特别是它们的 equals()hashCode() 方法,虽然可以编译通过,但必须根据合同进行重写。 - shmosel
4
界面这样做的事实在这方面可以说是一个糟糕的决定,我的回答只是强调这是一个比正常情况下更容易出现人为错误的地方。 - fragorl
显示剩余18条评论

30

您可以直接使用String.valueOf()

String.valueOf(charSequence)

尽管这与 toString() 相同,但它在实际调用 toString 之前对 charSequence 进行了空值检查。

当方法可以返回 charSequencenull 值时,这是有用的。


17
今天我遇到了这个问题。如果 charSequence 为空,返回的字符串将是 "null" 而不是 null - ChrisThomas
哦,明白了。我会删除这个答案。 - Abhishek Batra
2
我认为这对某些情况非常完美。 - Shukant Pal
1
这与charSequence.toString()非常相似,查看libcore/ojluni/src/main/java/java/lang/String.java中的定义public static String valueOf(Object obj) { return (obj == null) ? "null" : obj.toString(); } - Padmanabha V

14

最安全的方式

String string = String.valueOf(charSequence);

深入探讨

我们可以尝试三种常见的方法来将CharSequence转换为String:

  1. 类型转换: String string = (String) charSequence;
  2. 调用toString(): String string = charSequence.toString();
  3. String.valueOf()方法: String string = String.valueOf(charSequence);

如果我们在CharSequence charSequence = "a simple string";的情况下运行这些代码,则所有三者都会产生预期的结果。

问题在于当我们不确定CharSequence的性质时会发生什么。实际上,CharSequence是一个接口,几个其他类实现了它,例如-StringCharBufferStringBuffer等。因此,将String转换为CharSequence是一种简单的赋值操作,不需要任何强制转换或其他操作。但是,对于相反的操作,即向上转型,则不一定成立。

只有当我们确定CharSequence实际上是String的对象时,才能使用选项1-类型转换。否则,我们将收到ClassCastException的错误。在这种情况下,选项2和3是安全的。

另一方面,如果CharSequencenull,则选项2 - 调用toString()将产生NullPointerException

现在,在内部,String.valueOf()方法在执行null检查后调用toString()方法。因此,它是最安全的方法。 Java文档:

如果参数为null,则返回等于“null”的字符串;否则,返回obj.toString()的值。


请注意:如果CharSequencenull,则String.valueOf()方法将返回字符串- "null",而不是null


如果charSequencenull,则new StringBuilder(charSequence).toString();会抛出NullPointerException异常。 - Minhas Kamal

1

如果你想将一个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());
   }
}

0

你也可以使用 StringBuilder。

new StringBuilder(charSequence).toString();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接