- 「はい」と答えた場合は、文字列を変更する方法の例を挙げてください。
- 「いいえ」と答える場合は、Java 設計者が文字列の変更を許可しない理由を説明してください
4 に答える
いいえ、作成後に文字列を変更することはできません。 不変クラスString
の例です。次のコードがある場合:
String a = "hello";
String b = a;
a
現在、同じオブジェクトを参照していますが、参照している文字列を変更するb
ためにできることは何もありません。別の文字列にのみ割り当てることができます。a
b
a
Java設計者がこの方法を選択した理由について推測することしかできませんが、主な理由はコードの予測可能性を促進することだと思います。あなたがこのようなものを持っていたら。
String h = "house";
String hcopy = h;
その後のある時点で、実際に変更された文字列のh
ように変更することができました。これは、単純な変数が警告なしに値を変更した場合にも影響を及ぼし、非常に苛立たしいものになります。h.splitInHalf()
h
hcopy
String
String
変更可能な-like構造が必要な場合は、を使用できますStringBuffer
。
変更するたびに、新しいStringオブジェクトが実際に作成されます。変更可能なStringを使用する場合は、代わりにStringBuffer、StringBuilderを使用してください。
パフォーマンスを向上させるために、メモリ内に文字列定数プールがあります。
いいえ。
文字列は設計上不変です。文字列を変更したい場合は、StringBufferクラスを確認することをお勧めします。
不変はデザインパターンです。複数のエンティティがオブジェクトを参照できるため、不変性により、参照するオブジェクトが、それを参照する他のオブジェクトによって変更されていないことが保証されます。
私の経験では、これは面接でよく聞かれる質問です。java.lang.String
目的は、インタビュー対象者がクラスの内部を知っているかどうかを把握することです。
質問に答えるために、設計上、Java は String オブジェクトを変更することを許可していません。これらのオブジェクトは不変です。ただし、実際の本番コードでは決して行うべきではありませんが、Reflection API を使用して String オブジェクトを変更することは技術的に可能です。
import java.lang.reflect.Field;
public class App {
public static void main(String[] args) throws Exception {
String str = "Hello world!";
Field valueField = String.class.getDeclaredField("value");
valueField.setAccessible(true);
char[] c = (char[]) valueField.get(str);
c[1] = 'a';
System.out.println(str); //prints Hallo world!
}
}
よく言われるように、Java では「import java.lang.reflect.*;」という魔法の呪文を使用すると、自分の足を撃ち落とされます。