在Android的程序,大多数文本值预计在CharSequence
。
这是为什么? 优点是什么,以及使用的主要影响是什么CharSequence
超过String
?
有哪些主要差异,并预计什么问题,而使用它们,并从一个到另一个转换?
在Android的程序,大多数文本值预计在CharSequence
。
这是为什么? 优点是什么,以及使用的主要影响是什么CharSequence
超过String
?
有哪些主要差异,并预计什么问题,而使用它们,并从一个到另一个转换?
字符串是CharSequences ,所以你可以使用字符串,而不是担心。 Android是只是试图通过允许你还可以指定其他CharSequence的对象,如StringBuffers很有帮助。
这个类图可以帮助你看到字符串类型的大图在Java中7/8。 我不知道如果所有的这些都存在于Android的,但总体背景下仍然可以证明对你有用。
另外,还要注意对提出的意见接受的答案 。 该CharSequence
接口被改装到现有的类结构,所以有一些重要的微妙之处( equals()
和hashCode()
)。 注意标记在类/接口-相当多年来位流失的Java的各种版本(1,2,4和5)。 理想情况下CharSequence
本来从一开始的地方,但生活就是这样。
我相信这是最好用的CharSequence。 其原因是字符串实现CharSequence的,因此你可以通过一个字符串转换为CharSequence的,但你不能越过的CharSequence为String,因为CharSequence的不不执行字符串。 此外,在Android中EditText.getText()
方法返回一个可编辑,这还实现了CharSequence的并且可以容易地传递到一个,而不易为一个字符串。 CharSequence的处理所有!
在一般使用界面,让您改变最小的附带损害的实现。 虽然java.lang.String中的超人气有可能在某些情况下,人们可能希望使用另一个实现。 通过围绕CharSequences的API,而不是字符串的代码提供一个机会做到这一点。
这几乎可以肯定是性能方面的原因。 例如,假设一个分析器,通过一个500K字节缓冲区包含字符串去。
有3种方法来返回字符串的内容:
构建的String []在分析时,一次一个字符。 这将需要时间明显量。 我们可以使用==而不是.equals比较缓存引用。
构建一个int []与在分析时偏移,然后动态地构建字符串时,一个get()发生。 每一个字符串将是一个新的对象,所以不使用缓存的返回值和==
建立在分析时一个的CharSequence []。 由于没有新的数据被存储(比的偏移到字节缓冲器其他),解析要低得多的是#1。 在得到的时间,我们并不需要建立一个字符串,因此获得的性能等于#1(远优于#2),因为我们只返回一个现有对象的引用。
除了你开始使用的CharSequence的处理增益,你也不能复制数据减少内存占用。 举例来说,如果你有一个包含文本的三段缓冲,并希望返回要么全部3款单,您需要4个字符串来表示这一点。 使用CharSequence的你只需要1个缓冲区中的数据,并跟踪开始和长度的CharSequence实施的4个实例。
在实际的Android代码DO出现的一个问题是,随着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
是一个接口,而不是实际的类。 接口只是一组规则(方法),如果它实现了接口的类必须包含。 在Android上CharSequence
是各种类型的文本字符串的雨伞。 以下是一些常见的:
String
(没有造型跨度一成不变的文字) 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
就是1种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();
}
CharSequence
是一个接口和String
实现它。 您可以实例化一个String
,但你不能这样做,对于CharSequence
,因为它是一个接口。 你可以找到在其他实现CharSequence
官方Java网站。
的CharSequence是char值的可读序列,它实现的字符串。 它有4种方法
请参考文档的CharSequence文档