Java の String クラスが不変である理由 (詳細な説明)
public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for character storage. */ private final char value[];}
String クラスの値は次のとおりです。値配列に格納され、プライベートfinal
1によって変更されます。プライベート変更は、外部クラスが値にアクセスできず、サブクラスが値にアクセスできないことを示します。もちろん、String クラスはサブクラスを持つことができません。クラスは最終変更
2、最終変更です。値の参照は変更されず、値は String のコンストラクターでのみ初期化され、配列内の値を変更する他の方法はありません。値が保証するものであることを示します。 value の参照と値は変更されないということです。
したがって、String クラスは不変であると言います。
また、substring などの多くのメソッドは、元の String クラスでは動作せず、新しい String クラスを生成します。
public String substring(int beginIndex) { if (beginIndex < 0) { throw new StringIndexOutOfBoundsException(beginIndex); } int subLen = value.length - beginIndex; if (subLen < 0) { throw new StringIndexOutOfBoundsException(subLen); } return (beginIndex == 0) ? this : new String(value, beginIndex, subLen);}
String が無効に設定されているのはなぜですか?変化?
#文字列定数プール
Java には 8 つの基本データ型があります
整数型: byte、short、int、long。パッケージ化タイプは、Byte、Short、Integer、Long
浮動小数点タイプ: float、double です。パッケージ化タイプは Float、Double
Character type: char です。パッケージ化タイプは文字
ブール型: booleanです。パッケージング タイプは Boolean
定数プールは、システムのパフォーマンスに影響を与えるオブジェクトの頻繁な作成と破棄を回避するために使用され、オブジェクト共有を実装します。
たとえば、文字列定数プールは、コンパイル段階ですべての文字列リテラルを定数プールに置きます。 メモリ スペースの節約: 定数プール内のすべての同一の文字列定数はマージされ、1 つのスペースのみを占有します。jdk1.7 より前のことについては説明しません。jdk1.7 から文字列定数プールがヒープに配置されるようになり、この記事の内容はすべて jdk1 に基づいています。 8
次のコードはよく質問されますString str1 = "abc"; String str2 = "abc"; String str3 = new String("abc"); String str4 = new String("abc"); // trueSystem.out.println(str1 == str2); // falseSystem.out.println(str1 == str3); // falseSystem.out.println(str3 == str4);
メモリ内の構造は次のとおりです
定数プールには参照が格納されます
上記のコードの出力について説明します。Java で文字列オブジェクトを作成するには 2 つの方法があります
String str1 = "abc"; String str2 = "abc"; // trueSystem.out.println(str1 == str2);
String str3 = new String("abc"); String str4 = new String("abc"); // falseSystem.out.println(str3 == str4);
String クラスは不変であるため、String クラスが作成されると、ハッシュコードはハッシュ メンバー変数にキャッシュされます。ハッシュコードは変わりません。こうすることで、ハッシュコードを使いたいときに毎回再計算することなく直接取得できるので効率が上がります。
public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** Cache the hash code for the string */ private int hash; // Default to 0 }
String クラスの不変性により、HashMap のキーとして使用されることが多く、String クラスが可変で内容が変わると hashCode も変わります。このキーに基づいて HashMap から取得すると、値が取得されないか、間違った値が取得される可能性があります
スレッド セーフティ不変オブジェクト本質的にスレッドセーフであるため、マルチスレッド環境での問題を回避できます。 次に、String に対して同期操作を実行します。
読んでくれた皆さんに感謝します。多くの利益を得られることを願っています。
この記事は、https://blog.csdn.net/zzti_erlie/article/details/106872673
から転載されたものです:「java チュートリアル」
以上がJava の String クラスが不変である理由 (詳細な説明)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。