Java 中的 CharSequence VS String? CharSequence= 接口 = 具体实现String扭曲的历史

2022-08-31 04:30:56

在 Android 中编程时,大多数文本值都应在 .CharSequence

为什么?有什么好处,过度使用的主要影响是什么?CharSequenceString

使用它们以及从一个区别转换到另一个时,主要区别是什么,以及预期的问题是什么?


答案 1

字符串是字符序列,因此您只需使用字符串而不用担心。Android只是试图通过允许您指定其他CharSequence对象(如StringBuffers)来提供帮助。


答案 2

CharSequence= 接口
= 具体实现String

你说:

从一个转换到另一个

无法从 进行转换。String

  • 每个对象都是一个 .StringCharSequence
  • 每个都可以产生.调用 CharSequence::toString。如果 碰巧是 ,则该方法返回对其自身对象的引用。CharSequenceStringCharSequenceString

换句话说,每个都是一个,但不是每个都是一个。StringCharSequenceCharSequenceString

编程到接口

在Android中编程时,大多数文本值都期望在CharSequence中。

为什么?有什么好处,使用CharSequence而不是String的主要影响是什么?

通常,编程到接口比编程到具体类更好。这产生了灵活性,因此我们可以在特定接口的具体实现之间切换,而不会破坏其他代码。

在开发供各种程序员在各种情况下使用的API时,请编写代码以提供并采用最通用的接口。这使调用程序员可以自由地使用该接口的各种实现,无论哪种实现最适合其特定上下文。

例如,看看Java Collections Framework。如果您的 API 提供或采用对象的有序集合,请将您的方法声明为 using 而不是 、 或 的任何其他第三方实现。ListArrayListLinkedListList

当编写一个快速而肮脏的小方法,仅由代码在一个特定位置使用时,而不是编写要在多个位置使用的API,您不必费心使用更通用的接口而不是特定的具体类。但即便如此,使用最通用的界面确实会受到伤害。

使用它们时,主要区别是什么,以及预期的问题是什么,

  • 有了你知道你有一段文本,完全在内存中,并且是不可变的。String
  • 使用 ,您不知道具体实现的特定功能可能是什么。CharSequence

该对象可能表示大量文本,因此具有内存含义。或者可能是许多单独跟踪的文本块,当您调用时需要拼接在一起,因此存在性能问题。该实现甚至可能从远程服务中检索文本,因此具有延迟影响。CharSequencetoString

并从一个转换到另一个?

您通常不会来回转换。A .如果您的方法声明它需要 a,则调用程序员可能会传递一个对象,或者可能会传递其他内容,例如 a 或 。方法的代码将简单地使用传递的任何内容,调用任何方法。StringCharSequenceCharSequenceStringStringBufferStringBuilderCharSequence

最接近转换的是,如果您的代码收到一个,并且您知道您需要一个.也许您正在与编写到类而不是写入接口的旧代码进行交互。或者,您的代码可能会密集地处理文本,例如重复循环或以其他方式进行分析。在这种情况下,您希望仅对任何可能的性能造成一次影响,因此请预先调用。然后继续你的工作,使用你知道的完全在记忆中的一段文本。CharSequenceStringStringCharSequencetoString

扭曲的历史

请注意对已接受的答案所做的评论。该接口被改造到现有的类结构上,因此有一些重要的微妙之处( & )。请注意在类/接口上标记的各种版本的Java(1,2,4和5) - 多年来发生了相当多的改动。理想情况下,从一开始就已经存在,但这就是生活。CharSequenceequals()hashCode()CharSequence

下面的类图可以帮助您了解Java 7/8中字符串类型的大局。我不确定所有这些是否都存在于Android中,但整体上下文可能仍然对您有用。

diagram of various string-related classes and interfaces