不変オブジェクトは変更できないオブジェクトであることを理解しています。ただし、関数を使用すると文字列を変更できます。では、文字列は不変であるとどのように言うのでしょうか?これは質問されたインタビューでした。できるだけ早く答える必要があります
4 に答える
ただし、関数を使用すると文字列を変更できます。
いいえ、返されるのは別の文字列です。例:
String a, b, c;
a = "testing 1 2 3";
b = a.substring(0, 7); // Creates new string for `b`, does NOT modify `a`
c = a.substring(8);
System.out.println(b); // "testing"
System.out.println(c); // "1 2 3", proves that `a` was not modified when we created `b`
ご覧のとおり、文字列"testing 1 2 3"
は呼び出しによって変更されていません。substring
代わりに、 。だけで新しい文字列を取得しました"testing"
。
String
オブジェクトは、既存のオブジェクトの状態を変更するメソッドを提供しないため、Javaでは不変String
です。これらは、既存のオブジェクトのコンテンツに基づいて新しい オブジェクトを作成するメソッドのみを提供します。String
(もちろん、実際に反省して非常にいたずらなゲームをプレイしない限り、上記はそうです。)
もう1つは、文字列を作成すると、ヒープ内のメモリブロックが割り当てられ、その値を変更すると、その文字列に新しいメモリブロックが作成され、古い文字列がガベージコレクションの対象になります。 、 例えば
String first = "xyz";
String second = "xyz";
second = "abc";
これで、firstが作成されると、メモリのブロックがヒープ内の「first」に保持され、「second」の場合、新しいスペースは同じものを指すため割り当てられません。したがって、secondはヒープ内の同じスペースを指し、最後にsecondが値が変更されると、新しいメモリ位置を指します。したがって、文字列は内容が変更されないため不変です。文字列は削除され、新しい内容が割り当てられます。dubuggerを使用して、メモリがどのように占有されているかを確認します。プリミティブデータ型でも同じことに注意してください。内容は変更されません。それらのメモリ位置。
それが役に立てば幸い!
理由1.文字列はJavaのオブジェクトです。したがって、いつでも変更することはできません。例として
String s= new String ("Md Omar Faroque");
s.concat("anik");
System.out.println(s);
出力は「MdOmarFaroque」になります。
何故ですか?「MdOmarFaroque」に「Anik」を追加すると、「MdOmarFaroqueAnik」という新しい弦になります。この新しい文字列は、新しい変数を参照していません。Sは、「MdOmarFaroque」の参照変数です。
別の例を見てみましょう。
1. String s1 = "spring ";
2. String s2 = s1 + "summer ";
3. s1.concat("fall ");
4. s2.concat(s1);
5. s1 += "winter ";
6. System.out.println(s1 + " " + s2);
出力は「春冬春夏」である必要があります
何故ですか?5行目では、s1が新しい文字列「春冬」になります。以前の値「春」を忘れてしまいました。s1は今「春冬」を参照しているので、印刷しました。
2行目では、s2は「春夏」を参照しています。2行目には印刷されていますが、s1と再び連結され、新しい文字列「春夏春」が作成されました。ただし、この値「春夏春」を参照する新しい変数はなく、s2は「春夏」を指しています。
public class Example{
public static void main(String[] args) {
String s = "hello";
String a = s;
if (a == s) {// it will print if part of statement
System.out.println("same reference");
} else {
System.out.println("not same reference");
}
s = "hi";// now we have change this 's'
if (a == s) { // if we have changed the same s reference the it should
// print same reference
System.out.println("same reference");
} else {
System.out.println("not same reference");// but it will printed
}
}
}