String.subSequence()
有以下javadoc:
返回一个新的字符序列,它是该序列的子序列。
调用此方法的形式
str.subSequence(begin, end)
行为与调用完全相同
str.substring(begin, end)
定义此方法,以便String类可以实现CharSequence接口。
谁能解释一下?
使用str.subSequence(begin, end)
返回一个CharSequence,这是一个字符串的只读形式,表示为一系列字符。例如:
String string = "Hello";
CharSequence subSequence = s.subSequence(0, 5);
它是只读的,你不能在没有实例化chars
的新实例的情况下改变CharSequence
中的CharSequence
。
如果你必须使用str.subSequence(begin, end)
,你可以将结果转换为String
:
String string = "Hello";
String subSequence = (String) s.subSequence(0, 5);
并使用所有正常的String
运算符,如subSequence += " World";
子
子序列是子串,后缀和前缀的推广。查找作为两个或更多字符串的子序列的最长字符串被称为最长公共子序列问题。
示例:字符串“anna”是字符串“banana”的子序列:
banana
|| ||
an na
子
字符串的子字符串是字符串后缀的前缀,等效于前缀的后缀。如果一个字符串是另一个字符串的子字符串,那么它也是一个子序列,这是一个更通用的概念。
示例:字符串“ana”是两个不同偏移量的banana的子字符串(和子序列):
banana
|||||
ana||
|||
ana
阅读更多here。
但就Java而言,javadoc中明确指出它们的使用没有任何差别。正如在那里所述,方法subSequence
仅在类String
中实现,以便使其符合CharSequence
接口。而这种方法的名称确实只是用词不当。
要理解这一点,首先需要知道的是substring和subsequence之间的区别
substring是字符串的连续部分或子部分
而
子序列是字符串或序列的一部分,可能是连续的或不是连续的,但是元素的顺序是保持不变的
例
让str_a =“你好”
我们还有以下字符串:
str_b =“hello”,str_c =“ello th”,str_d =“hllo”,str_e =“ho hre”,str_f =“there hello”
str_b是str_a的子字符串,str_c也是str_a的子字符串,但str_d不是str_a的子字符串,因为此子字符串不连续。
现在所有子字符串都是子序列,因为维护了订单。
str_d是str_a的子序列,str_e也是str_a的子序列,但是str_f不是str_a的子序列,因为在这种情况下不保持顺序。
现在对于java,javadoc中没有关于这些方法的适当说明。
如果你看一下String的来源,你会看到子序列实际上调用了substring。它唯一与substring不同的是它将字符串转换为CharSequence。
简而言之,对String
物体来说无关紧要。它们是等价的,除非你需要将结果传递给只接受String
的东西,在这种情况下你必须使用subtring(int,int)
版本或将subsequence(int,int)
版本转换为String
(因为它就是内部的)。
String.substring(int,int)
首先存在,因为String
首先存在。在Java 1.4中,添加了CharSequence
,并且有人显然意识到在那里具有相同的功能是有用的,但是返回了CharSequence
而不是String
(为了灵活性)。所以,沿着来自CharSequence.subSequence(int,int)
。然而,由于String
实施CharSequence
,String
继承了看似多余的方法。
简单来说,理解:
子字符串:子字符串是字符串中连续的字符序列,其中oder很重要。
Substring
string
ring
子序列:从字符串,任何字符,但按顺序。
Substring
u s i
s b t i n g
r g
基本上它只是返回的东西。一个是String,另一个是CharSequence(你可以把它作为一个字符串)。 当您需要CharSequence类型的变量时,可以使用subSequence。