String.subString() 和 String.subSequence() 有什么区别

2022-09-01 06:16:43

String.subSequence()具有以下 javadoc:

返回一个新的字符序列,该序列是此序列的子序列。

对表单的此方法的调用

str.subSequence(begin, end)

行为方式与调用完全相同

str.substring(begin, end) 

定义此方法是为了使 String 类可以实现 CharSequence 接口。

谁能解释一下?


答案 1

要理解这一点,您需要知道的第一件事是子字符串子序列之间的区别是什么

子字符串是字符串的连续部分或子部分

子序列是字符串或序列的一部分,可能是连续的,也可能不是连续的,但元素的顺序保持不变

例如,假设我们有以下字符串:

str_a="hello there"
str_b="hello"
str_c="ello th"
str_d="hllo"
str_e="ho hre"
str_f="there hello"

str_b是 的子字符串,也是 的子字符串,但不是 的子字符串,因为此子字符串不连续str_astr_cstr_astr_dstr_a

现在,所有子字符串都是子序列,因为顺序是维护的。

str_d是 的子序列,也是 的子序列,但不是 的子序列,因为在这种情况下,顺序不被维护。str_astr_estr_astr_fstr_a

现在对于java来说,在javadoc中没有关于这些方法的适当说明。


答案 2

子序列

子序列是子字符串、后缀和前缀的推广。查找最长的字符串(即两个或多个字符串的子序列)称为最长的常见子序列问题。

示例:字符串“anna”是字符串“banana”的子序列:

banana
 || ||
 an na

字符串的子字符串是字符串后缀的前缀,等效地是前缀的后缀。如果一个字符串是另一个字符串的子字符串,它也是一个子序列,这是一个更一般的概念。

示例:字符串“ana”是香蕉的子字符串(和子序列),具有两个不同的偏移量:

banana
 |||||
 ana||
   |||
   ana

在此处阅读更多内容

但就Java而言,正如javadoc中明确指出的那样,它们的使用没有任何区别。此外,正如其中所述,该方法仅在类中实现,以保持其与接口的兼容性。而这种方法的名字确实只是用词不当。subSequenceStringCharSequence