新しい文字列(「123」)は、複数のオブジェクトを作成しましたか?

Stringオブジェクトは、多くの場合、メモリのパフォーマンスの最適化問題につながり、これに関連した顔の質問より身近ことができませんでした、この章のショー新しいString(「123」)は、例えば、記録のために、いくつかのオブジェクトを作成しました。

まず、あなたはそれを正しく答えることができます

String a = "123";

上記で定義したように、一定です。

String b = a +"456";

変数bについては、なぜですか?定スプライシングGETはミッシングリンクはされますか?

いいえ、まだ一定の取得一定のステッチが一定です。

しかし、この時点を基準となり、もはや定数、変数ではないので、その結果、Bの性質が変数です。

String b = "123" + "456"

この場合、Bは定数です。

あなたが最終的に修飾子を追加した場合、それは一定であるので、定数bです。


文字列定数と変数の違いの第二に、定義

我々は2つの書かれた分析に戻ってきます。

String a = "123";
String b = new String("123");

最初の行のように、我々は、変数bを作成するための新しいキーワードの形で、定数A、第二の行を定義します。

我々はそれ以上のJVMに行く前に、最初の行の一部が対象物に一定の目標点を通って、定数プール・スペース、ストレージ列123を開いたコンバインを学びました。新しいキーワードから2行目は、文字列123に格納されたヒープメモリ領域内のスペース、および付与変数bのメモリアドレスを開きます。

したがって、B ==?偽であることが示され、ヒープメモリが一定のプールです。

変更された場合:

String a = new String("123");

だから、それB ==?

それはまだfalseです。

なぜ?限り新しい形を介するなど、自然にその値が同じであっても、それが偽である、2つのオブジェクトを作成します。

第三に、要約文字列変数を定数

定数プールに保存されている文字列定数は、最適化で考慮JVMは、コンテンツオブジェクトが同じメモリブロックを共有しますが、変数がオンになっている、さまざまな変数の異なる新しい定義は、メモリアドレス空間をヒープ。

文字列定数の接続定数、または定数、まだ一定のプール管理ではなく、一定の接続変数は、変数です。

第四に、練習の複数のオブジェクトを作成します

(文字列定数プールすでに存在する場合には考慮されていない)例を以下に示します。

1、列A = "123"。

これは、オブジェクトを作成します

jvm在编译阶段会判断常量池中是否有 "123" 这个常量对象如果有,a直接指向这个常量的引用,如果没有会在常量池里创建这个常量对象。

2、String a=new String("123");

创建了2个对象

同情况1,jvm编译阶段判断常量池中 "123"存在与否,进而来判断是否创建常量对象,然后运行阶段通过new关键字在java heap创建String对象。

3、String a="123"+"456";

创建了1个对象

jvm编译阶段过编译器优化后会把字符串常量直接合并成"123456",所有创建对象时最多会在常量池中创建1个对象。

4、String a="123"+new String("456");

创建了4个对象

常量池对象"123" ,"456",new String("456")创建堆对象,还有一个堆对象"123456"。

最后练习参考文章:https://blog.csdn.net/baidu_27969827/article/details/79219708

おすすめ

転載: www.cnblogs.com/niceyoo/p/11100090.html