在Android中编程,大多数文本值都在CharSequence中。
为什么呢?使用CharSequence而不是String的好处是什么,主要影响是什么?
在使用它们和从一种转换到另一种时,主要的区别是什么,预期会出现什么问题?
在Android中编程,大多数文本值都在CharSequence中。
为什么呢?使用CharSequence而不是String的好处是什么,主要影响是什么?
在使用它们和从一种转换到另一种时,主要的区别是什么,预期会出现什么问题?
当前回答
这几乎肯定是性能方面的原因。例如,假设一个解析器通过一个包含字符串的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实现实例来跟踪开始和长度。
其他回答
在实际的Android代码中出现的一个问题是将它们与CharSequence进行比较。Equals是有效的,但不一定像预期的那样工作。
EditText t = (EditText )getView(R.id.myEditText); // Contains "OK"
Boolean isFalse = t.getText().equals("OK"); // will always return false.
应由
("OK").contentEquals(t.GetText());
CharSequence是一个可读的字符值序列,它实现了String。它有4个方法
charAt (int指数) 长度() 子序列(int start, int end) toString ()
请参考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。