String.subString()和String.subSequence()之间的区别是什么
String.subSequence()
具有以下javadoc:
返回一个新的字符序列,它是该序列的子序列。
调用此方法的forms
str.subSequence(begin, end)
行为与调用完全相同
str.substring(begin, end)
定义此方法,以便String类可以实现CharSequence接口。
谁有人解释一下?
使用str.subSequence(begin, end)
返回CharSequence ,它是表示为chars序列的字符串的只读forms。 例如:
String string = "Hello"; CharSequence subSequence = s.subSequence(0, 5);
它的读取只是在不实例化CharSequence
的新实例的情况下不能更改CharSequence
的chars
。
如果必须使用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
在这里阅读更多。
但就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
,有人显然意识到在那里使用相同的function会很有用,但是返回CharSequence
而不是String
(为了灵活性)。 所以,随之而来的是CharSequence.subSequence(int,int)
。 但是,由于String
实现了CharSequence
, String
inheritance了看似冗余的方法。
基本上它只是返回的东西。 一个是String,另一个是CharSequence(你可以把它作为一个字符串)。
当需要CharSequence类型的变量时,可以使用subSequence。