str
オブジェクトではなく、オブジェクトへの参照です。"Hello"
と"Help!"
は 2 つの異なるString
オブジェクトです。したがって、文字列str
を指します。それが指すものは変更できますが、それが指すものは変更できません。
たとえば、次のコードを使用します。
String s1 = "Hello";
String s2 = s1;
// s1 and s2 now point at the same string - "Hello"
さて、の値に影響を与える1に対してできることは何もありません。これらは同じオブジェクト (文字列) を参照しますが、そのオブジェクトは不変であるため、変更することはできません。s1
s2
"Hello"
次のようにすると:
s1 = "Help!";
System.out.println(s2); // still prints "Hello"
ここで、オブジェクトの変更と参照の変更の違いがわかります。s2
最初に指し示すように設定したものと同じオブジェクトをs1
指しています。に設定s1
すると、参照"Help!"
のみが変更され、最初に参照されていたオブジェクトは変更されません。String
文字列が変更可能な場合、次のようなことができます。
String s1 = "Hello";
String s2 = s1;
s1.setCharAt(1, 'a'); // Fictional method that sets character at a given pos in string
System.out.println(s2); // Prints "Hallo"
OPの編集に対応するための編集:
String.replace(char,char)のソース コード ( JDK インストール ディレクトリの src.zip にもあります。プロのヒントは、何かが実際にどのように機能するのか疑問に思うときはいつでもそこを見ることです) のソース コードを見ると、何がわかるかがわかります。それは次のとおりです。
- 現在の文字列に が 1 つ以上出現する場合は
oldChar
、現在の文字列のコピーを作成し、すべての出現箇所をoldChar
に置き換えnewChar
ます。
- が現在の文字列に存在しない場合は
oldChar
、現在の文字列を返します。
はい、"Mississippi".replace('i', '!')
新しいString
オブジェクトを作成します。ここでも、次のことが成り立ちます。
String s1 = "Mississippi";
String s2 = s1;
s1 = s1.replace('i', '!');
System.out.println(s1); // Prints "M!ss!ss!pp!"
System.out.println(s2); // Prints "Mississippi"
System.out.println(s1 == s2); // Prints "false" as s1 and s2 are two different objects
ここでの宿題は、次のように変更した場合に上記のコードがどのように動作するかを確認することs1 = s1.replace('i', '!');
ですs1 = s1.replace('Q', '!');
:)
1実際には、文字列 (およびその他の不変オブジェクト) を変更することが可能です。これにはリフレクションが必要であり、非常に危険であり、実際にプログラムを破壊することに興味がない限り、絶対に使用しないでください。