35

String.subSequence()有以下javadoc:

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

调用表单的这个方法

str.subSequence(begin, end)

行为方式与调用完全相同

str.substring(begin, end) 

定义此方法以便 String 类可以实现 CharSequence 接口。

谁能解释一下?

4

9 回答 9

52

要理解这一点,您首先需要知道的是子字符串和子序列之间有什么区别

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

然而

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

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

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_c也是 的子串,str_astr_d不是 的子串,str_a因为该子串不连续

现在所有子字符串都是子序列,因为顺序保持不变。

str_d是 的子序列str_astr_e也是 的子序列,str_astr_f不是 的子序列,str_a因为在这种情况下,不维持顺序。

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

于 2018-04-06T08:01:36.987 回答
49

子序列

子序列是子字符串、后缀和前缀的概括。找到两个或多个字符串的子序列的最长字符串称为最长公共子序列问题。

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

banana
 || ||
 an na

子串

字符串的子串是字符串后缀的前缀,相当于前缀的后缀。如果一个字符串是另一个字符串的子字符串,那么它也是一个子序列,这是一个更一般的概念。

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

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

在这里阅读更多。

但就 Java 而言,它们的使用没有任何区别,如javadoc中明确说明的那样。同样正如其中所述,该方法subSequence仅在类中实现,String以使其与CharSequence接口兼容。而且这个方法的名字确实是用词不当。

于 2013-03-19T16:48:12.990 回答
26

Usingstr.subSequence(begin, end)返回一个CharSequence,它是表示为字符序列的字符串的只读形式。例如:

String string = "Hello";
CharSequence subSequence = string.subSequence(0, 5);

chars它只是在CharSequence不实例化 a 的新实例的情况下无法更改的意义上读取的CharSequence

如果必须使用str.subSequence(begin, end),可以将结果转换为String

String string = "Hello";
String subSequence = (String) string.subSequence(0, 5);

并使用所有普通String运算符,例如subSequence += " World";

于 2013-03-19T17:13:30.683 回答
13

简单的理解:

子字符串:子字符串是字符串中连续的字符序列,其中 oder 很重要。

Substring
string
ring

Subsequences:从一个字符串,任何字符,但按顺序。

Substring
u s i
s b t i n g
r g
于 2019-03-31T19:46:52.253 回答
2

子串是连续的子序列。

例如,对于序列 abc,我们有

substrings: a, ab, abc, b, bc, c, and the empty substring;
subsequences: a, b, ab, c, ac, bc, abc, and the empty subsequence.

当字母重复时,一些子串和子序列看起来是一样的。

于 2020-01-03T04:59:29.107 回答
1

如果你看一下String的来源,你会看到子序列实际上调用了子字符串。它与子字符串唯一不同的是它将字符串转换为 CharSequence。

于 2016-02-25T11:04:47.687 回答
1

简而言之,它对对象来说并不重要String。它们是等价的,除非您需要将结果传递给只需要 的东西String,在这种情况下,您必须使用subtring(int,int)版本或将subsequence(int,int)版本转换为 a String(因为它是内部的)。

String.substring(int,int)先存在,因为String先存在。在 Java 1.4CharSequence中添加了,显然有人意识到在那里拥有相同的功能会很有用,但返回的是 aCharSequence而不是String(为了灵活性)。于是,随之而来CharSequence.subSequence(int,int)。但是,自从Stringimplements CharSequenceString继承了看似多余的方法。

于 2017-07-20T22:27:37.513 回答
0
于 2022-02-15T17:28:58.513 回答
-1

基本上它就是返回的内容。一个是 String,另一个是 CharSequence(您可以将其转换为字符串)。
当您需要 CharSequence 类型的变量时,您将使用 subSequence。

于 2014-07-15T06:04:35.697 回答