e-s*_*tis 404 java string charsequence
在Android中编程,大多数文本值都在预期中CharSequence.
这是为什么?有什么好处,使用CharSequence过的主要影响是String什么?
在使用它们和从一个转换到另一个时,主要的区别是什么,预期会出现什么问题?
Zar*_*nen 335
字符串是CharSequences,所以你可以使用字符串而不用担心.Android只是试图通过允许您指定其他CharSequence对象(如StringBuffers)来尝试提供帮助.
Bas*_*que 46
这个类图可以帮助您了解Java 7/8中字符串类型的大图.我不确定Android中是否存在所有这些内容,但总体情况可能仍然对您有用.
另请注意对已接受的答案所做的评论.所述CharSequence接口被改装到现有的类结构,所以有一些重要的细微之处(String&CharSequence).请注意在类/接口上标记的各种Java(1,2,4和5)版本 - 这些年来相当多的流失.理想情况下String,从一开始就会存在,但这就是生活.

小智 37
我相信最好使用CharSequence.原因是String实现了CharSequence,因此您可以将String传递给CharSequence,但是您无法将CharSequence传递给String,因为CharSequence不会实现String.另外,在Android中,该EditText.getText()方法返回一个Editable,它还实现了CharSequence并且可以轻松地传递到一个,而不是很容易地传入一个String.CharSequence处理所有!
Ita*_*man 23
通常,使用界面可以让您以最小的附带损害来改变实施方式.虽然java.lang.String非常受欢迎,但在某些情况下可能需要使用另一个实现.通过围绕CharSequences而不是字符串构建API,代码使人们有机会这样做.
这几乎可以肯定是性能原因.例如,假设一个解析器通过一个包含字符串的500k ByteBuffer.
返回字符串内容有3种方法:
在解析时构建一个String [],一次一个字符.这将花费相当多的时间.我们可以使用==而不是.equals来比较缓存的引用.
在解析时使用偏移量构建一个int [],然后在get()发生时动态构建String.每个String都是一个新对象,因此没有缓存返回值并使用==
在解析时构建CharSequence [].由于没有存储新数据(除了偏移到字节缓冲区之外),解析比#1低得多.在get时,我们不需要构建一个String,因此get性能等于#1(比#2好得多),因为我们只返回对现有对象的引用.
除了使用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.
Run Code Online (Sandbox Code Playgroud)
比较应该由
("OK").contentEquals(t.GetText());
Run Code Online (Sandbox Code Playgroud)
A CharSequence是接口,而不是实际的类。接口只是类在实现接口时必须包含的一组规则(方法)。在Android中,a CharSequence是各种类型的文本字符串的保护伞。这是一些常见的:
String (不带样式跨度的不可变文本)StringBuilder (无样式跨度的可变文本)SpannableString (具有样式范围的不可变文本)SpannableStringBuilder (具有样式范围的可变文本)(您可以在此处详细了解它们之间的区别。)
如果您有一个CharSequence对象,那么它实际上是实现的类之一的对象CharSequence。例如:
CharSequence myString = "hello";
CharSequence mySpannableStringBuilder = new SpannableStringBuilder();
Run Code Online (Sandbox Code Playgroud)
拥有像这样的通用伞类型的好处CharSequence是您可以用一种方法处理多种类型。例如,如果我有一个将a CharSequence作为参数的方法,则可以传入a String或a SpannableStringBuilder,它将处理其中一个。
public int getLength(CharSequence text) {
return text.length();
}
Run Code Online (Sandbox Code Playgroud)
您可以说a String只是一种CharSequence。但是,与不同CharSequence,它是一个实际的类,因此您可以从中创建对象。因此,您可以这样做:
String myString = new String();
Run Code Online (Sandbox Code Playgroud)
但您不能这样做:
CharSequence myCharSequence = new CharSequence(); // error: 'CharSequence is abstract; cannot be instantiated
Run Code Online (Sandbox Code Playgroud)
由于CharSequence只是String符合条件的规则列表,因此您可以执行以下操作:
CharSequence myString = new String();
Run Code Online (Sandbox Code Playgroud)
这意味着,只要方法要求CharSequence,就可以给它一个String。
String myString = "hello";
getLength(myString); // OK
// ...
public int getLength(CharSequence text) {
return text.length();
}
Run Code Online (Sandbox Code Playgroud)
但是,事实并非如此。如果该方法采用String参数,则无法传递通常只被称为a的参数CharSequence,因为它实际上可能是a SpannableString或某种其他类型的CharSequence。
CharSequence myString = "hello";
getLength(myString); // error
// ...
public int getLength(String text) {
return text.length();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
116078 次 |
| 最近记录: |