ホームページ  >  記事  >  Java  >  Java における intern() の役割を分析する

Java における intern() の役割を分析する

Y2J
Y2Jオリジナル
2017-05-19 09:43:433042ブラウズ

今日本を読んでいて、String の intern() メソッドに気づきました。これまで一度も見たことがありませんでしたが、よく見ていませんでした。それで今日見てみました。個人的には、定数プールからデータを取得する方がヒープからデータを取得するよりも高速であるため、このメソッドを String クラスに追加するとパフォーマンスが少し向上するのではないかと考えています。 (個人的な感想)

APIこのメソッドについてのいくつかの文、実際に要約すると、このメソッドを呼び出した後、定数プールにstringオブジェクトを追加するということです。メソッド領域 はい、これはメソッド領域の一部であり、メソッド領域はスレッドによって共有されるため、定数プールもスレッドによって共有されますが、スレッドアンセーフではなく、実際にはスレッドセーフです。同じ 値の reference は同じ場所を指すだけです。参照値が変更されても、定数プールに新しい値がない場合は、新しい定数の結果が開かれ、新しい参照に渡されます。同じオブジェクトの場合、new からの文字列と 変数 に直接割り当てられた文字列は異なる場所に格納され、後者は定数に格納されます。さらに、文字列のスプライシング操作が実行されている、つまり文字列が「+」に等しい場合、結果は定数プールまたはヒープに存在することになります。これは状況によって異なります。テストするには数行のコードを追加します。 結果を先に:

1. 文字列変数を直接定義する場合に値を代入する

式の右辺に文字列定数のみがある場合、その変数は定数プールに格納されます。

2. newで生成された文字列はヒープに格納されます。

3. 文字列を連結するとき、つまり「+」演算を実行するときは、次の 2 つの状況があります:

i. 式の右側が純粋な文字列定数の場合、スタックに格納されます。

ii. 式の右側に文字列オブジェクトのハンドルである文字列参照がある場合、それはヒープに格納されます。

   String str1 = "aaa";
        String str2 = "bbb";
        String str3 = "aaabbb";
        String str4 = str1 + str2;
        String str5 = "aaa" + "bbb";
        System.out.
print
ln(str3 == str4); // false
        System.out.println(str3 == str4.intern()); // true
        System.out.println(str3 == str5);// true

結果: str1、str2、str3、str5 はすべて定数プールに存在します。str4 は式の右半分に参照型があるため、str4 はヒープ メモリに存在します。ただし、str5 には参照型がありません。式の右側は純粋な文字列定数であり、定数プールに格納されます。実際、このパッケージ化タイプの

Integer

-128 ~ +127 も定数プールに格納されます。たとえば、Integer i1 = 10; Integer i2 == i2 となります。

パフォーマンスの最適化【関連する推奨事項】

1.

無料の Java ビデオチュートリアル

2. String オブジェクトの intern() の詳細な説明

3. Java の intern() メソッドの詳細な分析

4. JAVA での intern() メソッドの使用体験のまとめ

5. Java の intern メソッドの概念とは何ですか

以上がJava における intern() の役割を分析するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。