String.subString()和String.subSequence()之间的区别是什么

时间:2013-03-19 16:45:55

标签: java string substring subsequence

String.subSequence()有以下javadoc:

  

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

     

调用

形式的此方法
str.subSequence(begin, end)
     

的行为方式与调用

完全相同
str.substring(begin, end) 
     

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

任何人都可以解释一下吗?

8 个答案:

答案 0 :(得分:33)

<强>子序列

子序列是子字符串,后缀和前缀的泛化。查找作为两个或更多字符串的子序列的最长字符串被称为最长公共子序列问题。

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

banana
 || ||
 an na

<强>子串

字符串的子字符串是字符串后缀的前缀,等效于前缀的后缀。如果一个字符串是另一个字符串的子字符串,那么它也是一个子序列,这是一个更通用的概念。

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

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

了解更多here

但就Java而言,javadoc中明确指出它们的使用没有任何差别。正如其中所述,方法subSequence仅在类String中实现,以使其符合CharSequence接口。 而这种方法的名字确实只是用词不当。

答案 1 :(得分:21)

使用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";运算符

答案 2 :(得分:13)

要理解这一点,首先需要知道的是子串子序列

之间的区别

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

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

实施例

让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的子序列,因为在这种情况下不保持 order

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

简而言之,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实现CharSequenceString继承了看似多余的方法。

答案 5 :(得分:1)

子字符串是连续的子序列。

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

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

重复字母时,某些子串和子序列看起来相同。

答案 6 :(得分:0)

简单理解:

子字符串:子字符串是字符串中连续的字符序列,在其他情况下很重要。

Substring
string
ring

子序列:来自字符串的任何字符,但按顺序排列。

Substring
u s i
s b t i n g
r g

答案 7 :(得分:-1)

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