在Android编程中,大多数文本值都使用CharSequence
。
为什么?这有什么好处,使用CharSequence
相对于String
有哪些主要影响?
在使用它们和从一个类型转换到另一个类型时,主要的区别是什么,会有什么问题需要注意?
在Android编程中,大多数文本值都使用CharSequence
。
为什么?这有什么好处,使用CharSequence
相对于String
有哪些主要影响?
在使用它们和从一个类型转换到另一个类型时,主要的区别是什么,会有什么问题需要注意?
字符串是 CharSequences,所以您可以直接使用字符串而不必担心。Android 只是想帮助您通过允许指定其他 CharSequence 对象(如 StringBuffer)。
CharSequence
Javadoc的这一警告:该接口不改进equals
和hashCode
方法的一般契约。因此,比较实现CharSequence
接口的两个对象的结果通常是未定义的。每个对象可能是由不同的类实现的,而且不能保证每个类都能够测试其实例与其他类的实例进行相等性比较。因此,不适宜将任意CharSequence
实例用作集合中的元素或映射中的键。 - Trevor RobinsonCharSequence
是在 JDK 1.4 中进行修补的,以引入一个通用接口来处理包含字符序列的对象。其中一些对象包含其他状态,因此将 Object.equals
定义为“包含相同的字符序列”可能没有意义。例如,NIO CharBuffer
只公开其 position
和 limit
之间的字符作为 CharSequence
,尽管它可能包含许多其他字符。 - Trevor RobinsonObject
中定义了equals
/hashCode
方法... - PacerierObject
和CharSequence
中都不存在设计缺陷,没有必要使用接口来确保实现间的相等性。虽然不要求两个集合实现在Collection
接口中提供相等性,但如果它们选择这样做,则可以提供相等性。在我看来,CharSequence
应该限制在输入方面,并且在返回类型中使用较少。 - Brett RyanCharSequence
= 接口 String
= 具体实现CharSequence
是一个 接口。String
是其中的一个类,是 CharSequence
的具体实现。你说:
从一个转换到另一个
无法从 String
转换。
String
对象都是一个 CharSequence
。CharSequence
都可以生成一个 String
。调用 CharSequence::toString
。如果 CharSequence
恰好是一个 String
,则该方法返回对其自身对象的引用。换句话说,每个 String
都是一个 CharSequence
,但不是每个 CharSequence
都是一个 String
。
在 Android 中编程时,大多数文本值都期望为 CharSequence。
为什么?有什么好处,使用 CharSequence 比 String 的主要影响是什么?
通常,面向接口编程比面向具体类编程更好。这样可以提高灵活性,因此我们可以在不破坏其他代码的情况下在特定接口的具体实现之间进行切换。
当开发一个API以供各种情况下的程序员使用时,应编写代码以提供和接受最通用的接口。这使得调用程序员可以自由地使用该接口的各种实现,无论哪种实现对他们的特定上下文最好。List
而不是ArrayList
、LinkedList
或任何其他第三方List
实现。它们之间的主要区别是什么,使用它们会遇到什么问题?
String
表示一个单一的文本片段,完全在内存中,并且是不可变的。CharSequence
则表示一个未知的具体实现特征的文本片段。CharSequence
对象可能代表一个巨大的文本块,因此具有内存影响。或者可能是许多分别跟踪的文本块,在调用toString
时需要将它们拼接在一起,因此存在性能问题。实现甚至可能从远程服务检索文本,因此存在延迟影响。
如何进行相互转换?
通常不会进行来回转换。 String
就是一个CharSequence
。如果您的方法声明需要一个CharSequence
,调用者可以传递一个String
对象,也可以传递其他东西,例如StringBuffer
或StringBuilder
。您的方法代码将简单地使用传递的任何内容,调用任何CharSequence
方法。
CharSequence
并且您知道需要一个String
。也许您正在与旧代码进行接口,该代码编写为String
类而不是编写为CharSequence
接口。或者您的代码将密集地处理文本,例如重复循环或以其他方式进行分析。在这种情况下,您希望仅承受任何可能的性能损失一次,因此您首先调用toString
。然后使用您所知道的完全在内存中的单个文本继续进行工作。CharSequence
接口是针对现有类结构进行的修补,因此存在一些重要的微妙之处(equals()
和hashCode()
)。请注意Java的各个版本(1、2、4和5)标记在类/接口上-多年来发生了很大的变化。理想情况下,CharSequence
应该从一开始就存在,但生活就是如此。我认为最好使用CharSequence。原因是String实现了CharSequence接口,因此可以将String传递给CharSequence,但是不能将CharSequence传递给String,因为CharSequence没有实现String接口。此外,在Android中,EditText.getText()
方法返回一个Editable,它也实现了CharSequence,并且可以轻松地传递到其中一个,而不是轻松地传递到String中。CharSequence处理所有操作!
charSequence.toString()
这个方法。 - Jorge Fuentes González通常使用接口允许您以最小的副作用改变实现。虽然 java.lang.String 非常受欢迎,但在某些情况下,可能希望使用其他实现方式。通过围绕 CharSequences 构建 API 而不是 Strings,代码提供了这样的机会。
在实际的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
是一个接口,而不是一个实际的类。接口只是一组规则(方法),如果类实现了该接口,则必须包含这些规则。在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
只是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
实现。 - JABCharSequence
是一个接口,它没有任何你讨论的实现细节,因为它本身没有实现。 String
是几个实现 CharSequence
接口的具体类之一。所以 String
就是 CharSequence
。您可以比较 String
vs StringBuffer
vs StringBuilder
的性能细节,但不能比较 CharSequence
。写“使用 CharSequence 带来的处理收益”是没有意义的。 - Basil BourqueCharSequence
是一个接口,String
实现了它。您可以实例化一个 String
,但不能像 CharSequence
那样做,因为它是一个接口。您可以在官方 Java 网站中找到其他实现CharSequence
的类。
CharSequence是一个可读的char值序列,它实现了String。它有4个方法:
CharSequence
并不实现String
接口,但反过来是正确的。 - seh