StringBuiler など、プロパティを変更するときに新しいオブジェクトを作成しないオブジェクトは、 StringBuilder.append(String str) を呼び出して文字列を追加するときに、そのオブジェクトに格納されている文字列をプロパティとみなすことができます。既存の StringBuilder オブジェクト。はい、新しいオブジェクトはありません。
基本データ型のラッパークラスと String クラスを除くほぼすべてのクラスのオブジェクトは可変オブジェクトです。
プロパティを変更する場合は、既に「String str='abc'」があるので、新たに「str='efg'」を代入する必要があります。オブジェクトは「efg」を格納するために作成され、str はこの新しく作成されたオブジェクトを指します。
基本データ型のラッパークラスと String クラスのオブジェクトは不変オブジェクトです。
不変オブジェクトは、メモリ内の安定した領域を表します。参照変数がオブジェクトの内容を変更しようとすると、元のオブジェクトの内容を変更するのではなく、新しいオブジェクトを作成します。これにより、データの安定性が確保されます。したがって、不変オブジェクトは通常、データを安定に保つ必要がある状況で使用されます。
変数オブジェクトのプロパティを更新する場合、メモリ領域を節約するために新しいオブジェクトは作成されません。そのため、変数オブジェクトは主にカウンターなどのプロパティが頻繁に変更される状況で使用されます。したがって、統計オブジェクトと統計結果の間にマップ コレクションを構築します。 Integer オブジェクトは不変オブジェクトであり、統計結果を格納するには可変オブジェクトを使用する必要があります。もちろん、カスタム オブジェクトも使用できます。カウントに使用されます:
public void test01() { String str = "abc efe hig klm nop qrs"; String[] arr = str.split(" "); HashMap<String, int[]> map = new HashMap<String, int[]>();for (String x : arr) {int[] count = map.get(x);if (count != null) count[0]++;elsemap.put(x, new int[] { 1 }); } }
不変オブジェクトにはいくつかの利点があります:
1. メモリ割り当ては固定されており、拡張する必要はありません
2. 複数のコピーを任意にコピーでき、異なる間でのロックやロック解除は必要ありません。スレッド
これは、関数型プログラミングにおける「変数」の「不変」特性です。もちろん、コードの明瞭さなど、関数型プログラミングによって提唱される利点は他にもありますが、これは意見の問題です。
以上がJava における可変オブジェクトと不変オブジェクトの比較分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。