-->

CharSequence的VS字符串在Java中?CharSequence的VS字符串在Java中?

2019-05-13 22:14发布

在Android的程序,大多数文本值预计在CharSequence

这是为什么? 优点是什么,以及使用的主要影响是什么CharSequence超过String

有哪些主要差异,并预计什么问题,而使用它们,并从一个到另一个转换?

Answer 1:

字符串是CharSequences ,所以你可以使用字符串,而不是担心。 Android是只是试图通过允许你还可以指定其他CharSequence的对象,如StringBuffers很有帮助。



Answer 2:

这个类图可以帮助你看到字符串类型的大图在Java中7/8。 我不知道如果所有的这些都存在于Android的,但总体背景下仍然可以证明对你有用。

另外,还要注意对提出的意见接受的答案 。 该CharSequence接口被改装到现有的类结构,所以有一些重要的微妙之处( equals()hashCode() )。 注意标记在类/接口-相当多年来位流失的Java的各种版本(1,2,4和5)。 理想情况下CharSequence本来从一开始的地方,但生活就是这样。



Answer 3:

我相信这是最好用的CharSequence。 其原因是字符串实现CharSequence的,因此你可以通过一个字符串转换为CharSequence的,但你不能越过的CharSequence为String,因为CharSequence的不不执行字符串。 此外,在Android中EditText.getText()方法返回一个可编辑,这还实现了CharSequence的并且可以容易地传递到一个,而不易为一个字符串。 CharSequence的处理所有!



Answer 4:

在一般使用界面,让您改变最小的附带损害的实现。 虽然java.lang.String中的超人气有可能在某些情况下,人们可能希望使用另一个实现。 通过围绕CharSequences的API,而不是字符串的代码提供一个机会做到这一点。



Answer 5:

这几乎可以肯定是性能方面的原因。 例如,假设一个分析器,通过一个500K字节缓冲区包含字符串去。

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

  1. 构建的String []在分析时,一次一个字符。 这将需要时间明显量。 我们可以使用==而不是.equals比较缓存引用。

  2. 构建一个int []与在分析时偏移,然后动态地构建字符串时,一个get()发生。 每一个字符串将是一个新的对象,所以不使用缓存的返回值和==

  3. 建立在分析时一个的CharSequence []。 由于没有新的数据被存储(比的偏移到字节缓冲器其他),解析要低得多的是#1。 在得到的时间,我们并不需要建立一个字符串,因此获得的性能等于#1(远优于#2),因为我们只返回一个现有对象的引用。

除了你开始使用的CharSequence的处理增益,你也不能复制数据减少内存占用。 举例来说,如果你有一个包含文本的三段缓冲,并希望返回要么全部3款单,您需要4个字符串来表示这一点。 使用CharSequence的你只需要1个缓冲区中的数据,并跟踪开始和长度的CharSequence实施的4个实例。



Answer 6:

在实际的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()); 


Answer 7:

为CharSequence

一个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();
}


Answer 8:

CharSequence是一个接口和String实现它。 您可以实例化一个String ,但你不能这样做,对于CharSequence ,因为它是一个接口。 你可以找到在其他实现CharSequence官方Java网站。



Answer 9:

的CharSequence是char值的可读序列,它实现的字符串。 它有4种方法

  1. 的charAt(INT指数)
  2. 长度()
  3. 的subSequence(INT开始,INT端)
  4. 的toString()

请参考文档的CharSequence文档



文章来源: CharSequence VS String in Java?