java String类中subSequence和subString方法之间的区别

关于Java String类中subSequence方法和subString方法之间的区别,我有点困惑。 我读过这篇文章String.subString()和String.subSequence()之间的区别是什么 ,这个问题得到了回答,但我有点困惑,文章中提到“ 它只读,因为你无法改变CharSequence中的字符,无需实例化CharSequence的新实例 “。

但是,当我尝试使用以下示例时

String string = "Hello"; CharSequence subSequence = string.subSequence(0, 5); System.out.println(subSequence.subSequence(1, 4)); subSequence = subSequence.subSequence(1, 4); System.out.println(subSequence); 

它打印
埃尔
埃尔

我不知道我是否理解正确。 能否帮我澄清一下这个问题,请用一个例子告诉我subString和subSequence之间的区别

非常感谢

正如您链接的文章中所解释的那样,这两种方法之间的唯一区别是返回类型。 一个返回一个String ,另一个返回一个CharSequence

要理解的是CharSequence是一个接口String是一个实现 CharSequence

所以每个String也是CharSequence ,但反之亦然。 您可以将substring()的输出分配给CharSequence类型的变量,但不是相反:

 String string = "Hello"; String subString1 = string.substring(1,4); // ell String subString2 = string.subSequence(1, 4); // Type mismatch compiler error CharSequence subSequence1 = string.subSequence(1, 4); // ell CharSequence subSequence2 = string.substring(1, 4); // ell 

在这种特殊情况下,由于我们在String对象上执行subSequence()方法,因此将调用String实现, subSequence()返回一个substring()

 public CharSequence subSequence(int beginIndex, int endIndex) { return this.substring(beginIndex, endIndex); } 

当他们在String上调用substring()subSequence()方法时,这就是人们在谈论的内容。


关于你发布的代码,既然你开始使用String ,那么你对subSequence()所有调用实际上都只是subSequence() substring()调用。 因此,每次尝试“更改” CharSequence ,编译器实际上只是创建另一个String对象并向您传递对新对象的引用,而不是更改现有对象。

即使你的变量是CharSequence类型,它引用的对象实际上也是一个String

“它的读取只是在没有实例化CharSequence的新实例的情况下你不能改变CharSequence中的字符”。

我相信你的一部分困惑是你认为你正在使用以下代码更改CharSequence的字符:

 CharSequence subSequence = string.subSequence(0, 5); subSequence = subSequence.subSequence(1, 4); 

请注意,第二行创建一个全新的CharSequence对象并覆盖原始对象。 它不会更改原始的CharSequence 。 为了更好地理解这一点,我建议你阅读更多关于参考变量的内容。

提示:准备两个示例,一个使用subSequence,另一个使用subString。 每个都会给出一个结果。 尝试修改两个结果并观察会发生什么。

修改是对字符串的任何操作,这将导致不同的字符串,如添加或删除字符或更改字符。