文字列の内部動作と部分文字列メソッド - 1

「こんにちは、アミーゴ!」

「こんにちは、エリー」

「部分文字列について説明します。部分文字列は文字列の一部です。そして、(複数の文字列を結合した後に) 文字列に対して実行される最も一般的な操作は、部分文字列を取得することです。」

7) 文字列の一部を取得するにはどうすればよいですか?

「substring メソッドは String の一部を返します。このメソッドには 2 つのバージョンがあります。」

「最初のバージョンは、開始インデックスと終了インデックスで指定された部分文字列を返します。ただし、終了インデックスの文字は含まれません!数値 1 と 3 を渡すと、部分文字列には 2 番目と 3 番目の文字のみが含まれます (インデックスの開始位置を思い出してください) 0)。

「2 番目のバージョンは、渡されたインデックスから文字列の終わりまでの部分文字列を返します。」

方法
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 は不変クラスです。そして、それが私たちにどのような利点をもたらしますか? 偶然にも、重要な利点の 1 つは、部分文字列を取得できることです。しかし、まず最初に。」

「内部的には、String オブジェクトには文字の配列が含まれており、推測するのはそれほど難しくありません。しかし、さらに 2 つの変数も保存されます。それは、配列内の最初の文字のインデックスと文字数です。ここで、これらが何であるかを説明します。に使用されます。」

「substring メソッドを使用して部分文字列を作成すると新しいStringオブジェクトが作成されます。」

「しかし、オブジェクトは新しい文字配列への参照を保存する代わりに、古い配列への参照と、それに関連付けられている元の文字配列の部分を決定するために使用する 2 つの変数を保存します。」

「それは何も分かりませんでした。」

「部分文字列が作成されるとき、文字配列は新しい String オブジェクトにコピーされません。代わりに、両方のオブジェクトが元の文字配列への参照を保存します。しかし! 2 番目のオブジェクトには、2 つの変数も保存されます。配列内の開始インデックスと、部分文字列に属する文字の数。」

"見てみな:"

部分文字列の取得 部分文字列内に格納されるもの
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;

「3 つの String はすべて、同じ char 配列への参照を格納しますが、それに関連する最初と最後の文字のインデックスも格納します。より正確には、最初の文字のインデックスと文字数も格納します。」

「それはもう当然ですね。」

「したがって、長さ 10,000 文字の String を取得し、任意の長さの部分文字列を 10,000 個作成すると、文字配列が重複しないため、これらの部分文字列が使用するメモリはほとんどなくなります。これらの String は、大量に使用することが予想されます。文字通り数バイトしかかかりません。」

"いいね!"

「しかし、文字列を変更できれば、それができるでしょうか?」

「いいえ、誰かが最初の文字列を変更すると、その部分文字列もすべて変更される可能性があります。これで、彼らがなぜそんなことをしたのかが理解できます。これは本当に素晴らしい解決策です。」

"気に入ってもらってうれしいです。"