我对Java String类中subSequence方法和subString方法之间的区别有点混淆。我读过这篇文章What is the difference between String.subString() and 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);
它打印
埃尔
ELL
我不知道我是否理解正确。你能帮我解释一下吗?请告诉我 subString和subSequence 与示例的区别
非常感谢
答案 0 :(得分:11)
正如您链接的文章所述,这两种方法之间的唯一区别是返回类型。一个返回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
在这种特殊情况下,由于我们在subSequence()
对象上执行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
。
答案 1 :(得分:0)
“它的读取只是在不实例化CharSequence的新实例的情况下无法更改CharSequence中的字符”。
我相信你的一部分困惑是,你认为你正在使用以下代码更改CharSequence
中的字符:
CharSequence subSequence = string.subSequence(0, 5);
subSequence = subSequence.subSequence(1, 4);
请注意,第二行会创建一个全新的CharSequence
对象并覆盖原始对象。 不更改原始CharSequence
。为了更好地理解这一点,我建议你阅读更多有关参考变量的内容。
答案 2 :(得分:-1)
提示:准备两个示例,一个使用subSequence,另一个使用subString。 每个都会给出一个结果。 尝试修改两个结果并观察会发生什么。
修改是对字符串的任何操作,这将导致不同的字符串,如添加或删除字符或更改字符。