ホームページ  >  記事  >  Java  >  Javaにおけるヒープとスタックの違いの分析

Javaにおけるヒープとスタックの違いの分析

高洛峰
高洛峰オリジナル
2017-01-24 14:52:052087ブラウズ

ヒープとスタックは、Java データ構造における非常に重要な概念です。この記事では、この 2 つの違いについて詳しく分析します。参考のため。詳細は次のとおりです:

Java のヒープはランタイム データ領域であり、クラス オブジェクトはそこから領域を割り当てます。これらのオブジェクトは、new、newaray、anewarray、multianewarray などの命令を通じて作成され、プログラム コードを明示的に解放する必要はありません。ヒープはガベージ コレクションによって処理されます。ヒープの利点は、メモリ サイズを動的に割り当てることができることです。また、実行時にメモリを動的に割り当てるため、有効期間を事前にコンパイラに伝える必要がありません。ガベージ コレクターはこれらのデータを自動的に収集しなくなります。ただし、欠点は、実行時にメモリが動的に割り当てられるため、アクセス速度が遅くなることです。ただし、スタックの利点は、アクセス速度がヒープよりも速いことです。欠点は、スタック データが共有できることです。スタックに格納されるデータのサイズと有効期間を決定する必要があり、スタックには主にいくつかの基本的なタイプの変数 (int、short、long、など) が格納されます。 byte、float、double、boolean、char) とオブジェクト ハンドル

スタックに格納されたデータを同時に定義できるとします。 b = 3;

コンパイラはまず int a = 3; 変数 a への参照をスタック上に作成し、スタック上に値 3 があるかどうかを調べます。が見つからない場合、3 が保存され、a は 3 を指します。次に、b が作成された後、変数を参照した後、スタックに 3 の値が存在するため、 int b = 3 が処理されます。このように、a と b は同時に 3 を指します。このとき、a=4 の場合、プロセッサは 4 の値があるかどうかを再検索します。そうでない場合は、4 を格納して 4 をポイントし、それがすでに存在する場合は、a をこのアドレスに直接ポイントするため、a の値の変更は b に影響を与えません。この種のデータ共有は、同時に 1 つのオブジェクトを指す 2 つのオブジェクトの参照の共有とは異なることに注意してください。この場合、 a の変更は b には影響せず、コンパイラによって完了されるためです。スペースを節約します。オブジェクト参照変数がオブジェクトの内部状態を変更すると、他のオブジェクト参照変数に影響を与えます:

String str = new String("abc");
String str = "abc";



1 つ目は、次の 2 つの方法です。 new() を使用して新しいオブジェクトを作成し、それをヒープに保存します。2 番目の方法では、最初にオブジェクト参照変数 str を作成します。 Stringクラスの「abc」がスタックに格納されているかどうかを確認し、格納されていない場合はスタックに「abc」を格納し、すでに「abc」がある場合はstrに「abc」を指すようにします。 "abc"。

クラス内の値が等しいかどうかを比較する場合は、equals() メソッドを使用します。2 つのパッケージ化クラスの参照が同じオブジェクトを指しているかどうかをテストする場合は、== を使用します。以上の理論です。

String str1 = "abc";
String str2 = "abc";
System.out.println(str1==str2); //true

str1 と str2 が同じオブジェクトを指していることがわかります。

String str1 =new String ("abc");
String str2 =new String ("abc");
System.out.println(str1==str2); // false

さまざまなオブジェクトを生成するには new を使用します。一度に 1 つずつ生成します。

つまり、最初の方法を使用して複数の「abc」文字列を作成すると、実際にはメモリ内にオブジェクトが 1 つだけ存在することになり、メモリ領域を節約できると同時に、実行速度も向上します。これは、JVM がスタック内のデータの実際の状況に基づいて、新しいオブジェクトを作成する必要があるかどうかを自動的に判断するためです。 String str = new String("abc"); のコードは、文字列値が等しいかどうか、新しいオブジェクトを作成する必要があるかどうかに関係なく、常に新しいオブジェクトがヒープに作成されるため、負荷が増加します。番組上で。

一方で、注意してください: String str = "abc"; のような形式を使用してクラスを定義する場合、常に String クラスのオブジェクト str が作成されると想定されます。罠の心配も!オブジェクトが作成されていない可能性があります。以前に作成したオブジェクトを指すだけの場合もあります。新しいオブジェクトが毎回確実に作成されるようにするには、 new() メソッドを使用する必要があります。

String クラスの不変の性質により、String 変数の値を頻繁に変更する必要がある場合は、プログラムの効率を向上させるために StringBuffer クラスの使用を検討する必要があります。

この記事が皆さんの Java プログラミングの学習に役立つことを願っています。

Java のヒープとスタックの違いの分析に関連する記事をさらに知りたい場合は、PHP 中国語 Web サイトに注目してください。

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