在Android中编程,大多数文本值都在CharSequence中。

为什么呢?使用CharSequence而不是String的好处是什么,主要影响是什么?

在使用它们和从一种转换到另一种时,主要的区别是什么,预期会出现什么问题?


当前回答

CharSequence是一个接口,String实现了它。你可以实例化一个字符串,但你不能为CharSequence这样做,因为它是一个接口。你可以在官方Java网站上找到CharSequence中的其他实现。

其他回答

CharSequence是一个接口,String实现了它。你可以实例化一个字符串,但你不能为CharSequence这样做,因为它是一个接口。你可以在官方Java网站上找到CharSequence中的其他实现。

CharSequence进行

CharSequence是一个接口,而不是实际的类。接口只是类实现接口时必须包含的一组规则(方法)。在Android中,CharSequence是各种类型文本字符串的保护伞。以下是一些常见的错误:

字符串(没有样式跨度的不可变文本) StringBuilder(没有样式跨度的可变文本) SpannableString(具有样式跨度的不可变文本) SpannableStringBuilder(具有样式跨度的可变文本)

(你可以在这里阅读更多关于它们之间的区别。)

如果你有一个CharSequence对象,那么它实际上是一个实现CharSequence的类的对象。例如:

CharSequence myString = "hello";
CharSequence mySpannableStringBuilder = new SpannableStringBuilder();

使用CharSequence这样的通用伞形类型的好处是,您可以用一个方法处理多个类型。例如,如果我有一个方法,以CharSequence作为参数,我可以传入String或SpannableStringBuilder,它将处理任何一个。

public int getLength(CharSequence text) {
    return text.length();
}

字符串

你可以说String只是CharSequence的一种。然而,与CharSequence不同的是,它是一个实际的类,因此您可以从它创建对象。所以你可以这样做:

String myString = new String();

但你不能这样做:

CharSequence myCharSequence = new CharSequence(); // error: 'CharSequence is abstract; cannot be instantiated

因为CharSequence只是String遵循的规则列表,你可以这样做:

CharSequence myString = new String();

这意味着任何时候一个方法请求CharSequence,都可以给它一个String。

String myString = "hello";
getLength(myString); // OK

// ...

public int getLength(CharSequence text) {
    return text.length();
}

然而,反过来就不对了。如果这个方法接受一个String参数,你不能传递给它一个通常被认为是CharSequence的东西,因为它实际上可能是一个SpannableString或其他类型的CharSequence。

CharSequence myString = "hello";
getLength(myString); // error

// ...

public int getLength(String text) {
    return text.length();
}

字符串是CharSequences,所以你可以只使用字符串,不用担心。Android只是试图通过允许你指定其他CharSequence对象来提供帮助,比如stringbuffer。

一般来说,使用接口允许您以最小的附带损害改变实现。虽然java.lang.String非常流行,但在某些情况下,人们可能想使用另一种实现。通过围绕CharSequences而不是string构建API,代码提供了这样做的机会。

我认为最好使用CharSequence。原因是String实现了CharSequence,因此你可以传递一个String到一个CharSequence,然而你不能传递一个CharSequence到一个String,因为CharSequence不实现String。此外,在Android中,EditText.getText()方法返回一个可编辑的,它也实现了CharSequence,可以很容易地传递到一个,而不容易传递到字符串。CharSequence处理所有!