对于Java类中的subSequence方法和subString方法之间的区别,我有些困惑。我阅读了已经回答了这个问题的文章What is the difference between String.subString() and String.subSequence(),但我有点困惑,这篇文章提到了"Its只读,意思是您不能在不实例化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);印出来
ell
ell
我不知道我是否正确地理解了它。请您帮助我澄清这一点,并以一个例子告诉我subString和subSequence的区别。
非常感谢
发布于 2014-10-25 08:15:22
正如您所链接的文章中所解释的,这两种方法之间唯一的区别是返回类型。一个返回一个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对象上执行String方法,因此将调用String实现,后者只返回一个substring()
public CharSequence subSequence(int beginIndex, int endIndex) {
return this.substring(beginIndex, endIndex);
}当人们说substring()和subSequence()方法在String上调用时是相同的,这就是他们所谈论的。
关于您发布的代码,由于您是从String开始的,所以对subSequence()的所有调用实际上都是隐藏的substring()调用。因此,每次您试图“更改”您的CharSequence时,编译器实际上只是创建另一个String对象,并向您传递一个对新对象的引用,而不是更改现有对象。
即使变量是CharSequence类型的,它引用的对象实际上是一个String。
发布于 2014-10-25 21:09:46
“它的只读含义是,如果不实例化CharSequence的新实例,就不能更改CharSequence中的字符”。
我认为您混淆的部分原因是您认为您正在用以下代码更改CharSequence中的字符:
CharSequence subSequence = string.subSequence(0, 5);
subSequence = subSequence.subSequence(1, 4);请注意,第二行创建一个全新的CharSequence对象并覆盖原始对象。它不更改原始CharSequence。为了更好地理解这一点,我建议您多读一些关于引用变量的内容。
发布于 2014-10-25 08:09:44
提示:准备两个示例,一个使用subSequence,另一个使用subString。每个人都会给出结果。尝试修改这两个结果,并观察发生了什么。
修改是对字符串的任何操作,这将导致不同的字符串,例如添加或删除字符,或更改字符。
https://stackoverflow.com/questions/26560440
复制相似问题