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

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

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


当前回答

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

其他回答

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

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

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

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

这几乎肯定是性能方面的原因。例如,假设一个解析器通过一个包含字符串的500k ByteBuffer。

有3种方法返回字符串内容:

Build a String[] at parse time, one character at a time. This will take a noticeable amount of time. We can use == instead of .equals to compare cached references. Build an int[] with offsets at parse time, then dynamically build String when a get() happens. Each String will be a new object, so no caching returned values and using == Build a CharSequence[] at parse time. Since no new data is stored (other than offsets into the byte buffer), the parsing is much lower that #1. At get time, we don't need to build a String, so get performance is equal to #1 (much better than #2), as we're only returning a reference to an existing object.

除了使用CharSequence获得的处理收益之外,还可以通过不复制数据来减少内存占用。例如,如果您有一个包含3段文本的缓冲区,并且希望返回全部3段或单个段落,您需要4个字符串来表示。使用CharSequence,您只需要1个数据缓冲区,以及4个CharSequence实现实例来跟踪开始和长度。