次の2つのステートメントの簡潔で詳細な違いを説明してください。
String a= "somevalue";
String b = new String("somevalue");
b
2番目のステートメントがヒープ内の文字列オブジェクトにメモリを作成して提供することを知っています。しかし、なぜオブジェクトa
はメモリを取得せず、文字列メソッドでの操作が許可されているのですか。
次の2つのステートメントの簡潔で詳細な違いを説明してください。
String a= "somevalue";
String b = new String("somevalue");
b
2番目のステートメントがヒープ内の文字列オブジェクトにメモリを作成して提供することを知っています。しかし、なぜオブジェクトa
はメモリを取得せず、文字列メソッドでの操作が許可されているのですか。
a
およびb
はオブジェクトへの参照であり、オブジェクトへの参照ではありません。
a = b;
オブジェクトをコピーしない場合は、オブジェクトへの参照がコピーされます。
文字列のchar[]
中には別のオブジェクトである文字列があります。
a
既存のオブジェクトへの参照を取得するため、追加のメモリは必要ありません。
b
より多くのメモリを必要とするように、新しく作成されたオブジェクトへの参照を取得します。
それでも文字列メソッドを操作できます。
これは、オブジェクトがどのように作成されたかとは関係ありません。
1つ目は、変数へのリテラル文字列オブジェクト「somvalue」に影響しますa
。このリテラル文字列オブジェクトは、すべてのリテラル文字列と同様にプールにキャッシュされます。
2つ目は、空の文字列の新しいインスタンスを作成します。String b = "";
Stringインスタンスは不変であるため、新しいオブジェクトを無料でインスタンス化することを除いて、と同等です。