字符串内部工作原理和子字符串方法 -​​ 1

“嗨,阿米戈!”

“嗨,艾莉。”

“我要告诉你有关子字符串的知识。子字符串是字符串的一部分。对字符串执行的最常见操作(将多个字符串组合在一起后)是获取子字符串。”

7) 如何获取字符串的一部分?

“子字符串方法返回字符串的一部分。此方法有两个版本。”

“第一个版本返回由起始索引和结束索引指定的子字符串。但不包括结束索引处的字符!如果传递数字 1 和 3,则子字符串将仅包含第二个和第三个字符(记住索引开始0)。”

“第二个版本返回从传递的索引开始直到字符串结尾的子字符串。”

方法) 例子)
String substring(int beginIndex, int endIndex)
String s = "Good news, everyone!";
s = s.substring(1,6);
结果:

s == "ood n";
String substring(int beginIndex)
String s = "Good news, everyone!";
s = s.substring(1);

“这很简单。谢谢,艾莉。”

“我还将向您解释 String 对象的内部工作原理。”

“正如您可能已经知道的那样,String 是一个不可变的类。这给我们带来了哪些优势?碰巧的是,其中一个关键优势是能够获取子字符串。但首先要做的是。”

“在内部,一个 String 对象包含一个字符数组,这并不难猜。但它还存储了两个变量:数组中第一个字符的索引和字符数。现在我告诉你这些是什么用于。”

“当我们使用substring方法创建子字符串时,会创建一个新的String对象。”

“但是,该对象不是存储对新字符数组的引用,而是存储对旧数组的引用以及它用来确定与其关联的原始字符数组部分的两个变量。”

“我一点都不明白。”

“创建子字符串时,字符数组不会复制到新的 String 对象。相反,两个对象都存储对原始字符数组的引用。但是!第二个对象还存储两个变量:它在数组中的起始索引和属于子字符串的字符数。”

“一探究竟:”

获取子字符串 子字符串中存储了什么
String s = "mama";
s中存储了什么:

char[] value = {'m','a','m','a'};
offset = 0;
count = 4;
String s2 = s.substring(1);
s2 中存储的内容:

char[] value = {'m','a','m','a'};
offset = 1;
count = 3;
String s3 = s.substring(1, 3);
s3 中存储的内容:

char[] value = {'m','a','m','a'};
offset = 1;
count = 2;

“所有三个字符串都存储对同一个字符数组的引用,但它们还存储与其相关的第一个和最后一个字符的索引。或者更准确地说,第一个字符的索引和字符数。”

“现在说得通了。”

“因此,如果您使用一个 10,000 个字符长的字符串并创建 10,000 个任意长度的子字符串,这些子字符串将使用非常少的内存,因为字符数组没有重复。这些字符串,您预计会用掉很多的空间,实际上只需要几个字节。”

“凉爽的!”

“但是如果你可以修改字符串,你能做到吗?”

“不,有人可以改变第一个字符串,然后它的所有子字符串也会改变。现在他们这样做的原因是有道理的。这是一个非常酷的解决方案。”

“我很高兴你喜欢它。”