ヒープとスタックは、Java データ構造における非常に重要な概念です。この記事では、この 2 つの違いについて詳しく分析します。ご参考までに。詳細は以下のとおりです。
Java のヒープは、クラス オブジェクトがスペースを割り当てるランタイム データ領域です。これらのオブジェクトは、new、newaray、anewarray、multianewarray などの命令によって作成され、プログラム コードを明示的に解放する必要はありません。ヒープはガベージ コレクションによって収集されます。ヒープの利点は、メモリ サイズを動的に割り当てることができることです。ヒープは実行時に動的にメモリを割り当て、Java のガベージ コレクタがこれらの不要になったメモリを自動的に収集するため、事前にライフタイムをコンパイラに伝える必要がありません。ただし、実行時に動的にメモリを割り当てる必要があるため、アクセス速度が遅いという欠点があります。
スタックの利点は、アクセス速度がヒープに比べてレジスタに次いで速いことと、スタックのデータを共有できることです。ただし、スタックに保存されるデータのサイズと有効期間を決定する必要があり、柔軟性に欠けるという欠点があります。スタックには主に、いくつかの基本的なタイプの変数 (int、short、long、byte、float、double、boolean、char) とオブジェクト ハンドルが格納されます。
スタックの非常に重要な特殊機能は、スタックに格納されたデータを共有できることです。次のようにも定義するとします。
int a = 3;
int b = 3;
コンパイラはまず int a = 3 を処理し、まずスタック上に変数 a への参照を作成し、次にスタック上に値 3 があるかどうかを確認し、見つからない場合は 3 を格納し、次に a をポイントします。 3.次に、 b の参照変数を作成した後、 int b = 3; を処理します。スタックにはすでに値 3 があるため、b は直接 3 を指します。このように、a と b が同時に 3 を指す状況が発生します。
このとき、a=4 が再度設定されると、コンパイラはスタックに 4 の値があるかどうかを再検索し、ない場合は 4 を格納し、すでに存在する場合は 4 をポイントします。は、このアドレスを直接指します。したがって、a の値が変化しても b の値には影響しません。
この種のデータ共有は、同時に 1 つのオブジェクトを指す 2 つのオブジェクトの参照の共有とは異なることに注意してください。この場合、a の変更は b には影響せず、コンパイラによって完了されるためです。スペースの節約に役立ちます。オブジェクト参照変数がオブジェクトの内部状態を変更すると、別のオブジェクト参照変数に影響を与えます。
文字列は特別なラッパー型のデータです。使用可能:
文字列 str = 新しい文字列 ("abc");文字列 str = "abc";
作成方法は 2 つあります。1 つ目は、new() を使用して新しいオブジェクトを作成し、それをヒープに保存する方法です。呼び出されるたびに新しいオブジェクトが作成されます。
2つ目は、Stringクラスのオブジェクト参照変数strをスタック上に作成し、スタックに「abc」が格納されているかどうかを確認し、格納されていない場合はスタックに「abc」を格納し、strを「abc」に指すようにする方法です。 ". 、すでに "abc" がある場合は、str を直接 "abc" にポイントします。
クラス内の値が等しいかどうかを比較する場合は、equals() メソッドを使用します。2 つのラッパー クラスの参照が同じオブジェクトを指しているかどうかをテストする場合は、== を使用します。
文字列 str1 = "abc"; 文字列 str2 = "abc"; //true
str1 と str2 が同じオブジェクトを指していることがわかります。
String str1 =new String ("abc"); String str2 =new String ("abc"); // false
new を使用すると、さまざまなオブジェクトが生成されます。一度に 1 つずつ生成します。
したがって、最初の方法を使用して複数の「abc」文字列を作成すると、実際にはメモリ内にオブジェクトが 1 つだけ存在することになり、メモリ領域を節約できると同時に、実行速度も向上します。これは、JVM がスタック内のデータの実際の状況に基づいて、新しいオブジェクトを作成する必要があるかどうかを自動的に判断するためです。 String str = new String("abc"); のコードの場合、文字列値が等しいかどうか、または新しいオブジェクトを作成する必要があるかどうかに関係なく、常に新しいオブジェクトがヒープに作成されるため、負荷が増加します。プログラム。
一方、注意してください: String str = "abc"; のような形式を使用してクラスを定義する場合、常に String クラスのオブジェクト str が作成されると想定されます。罠の心配も!オブジェクトが作成されていない可能性があります。代わりに、以前に作成されたオブジェクトを指すだけの場合もあります。新しいオブジェクトが毎回確実に作成されるようにするには、 new() メソッドを使用する必要があります。
String クラスの不変の性質により、String 変数の値を頻繁に変更する必要がある場合は、プログラムの効率を向上させるために StringBuffer クラスの使用を検討する必要があります。
この記事で説明した内容が、皆さんの Java プログラミングの学習に役立つことを願っています。