JAvaのスタックとスタック
8904 ワード
Java , ( 。 new、newarray、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。 int b = 3; b , 3 , b 3。 , a b 3 。
, a=4; 4 , , 4 , a 4; , a 。 a b 。
, a b, , 。 , 。
String 。 :
String str = new String("abc");
String str = "abc";
, new() , 。 。
String str, "abc", , "abc" , str ”abc”, ”abc” str “abc”。
, equals() ; , ==, 。
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 。 。
”abc” , . . , JVM 。 String str = new String("abc"); , , , , 。
, : String str = "abc"; , , String str。 ! ! 。 new() 。
String immutable , String , StringBuffer , 。
その他の答え:
(一)
, , , 。 , 。 。 、 。
, , ( )。 。 ( : ), , , 。
, , , 。 , 。 , , , , 。
, 。 , 。 , , , 。 , , , ; ( ), , 。 , , 。 , , 。
(二)
,
1. (stack) (heap) Java Ram 。 C++ ,Java , 。
2. , , CPU 。 , , 。 , , 3 。 , ,Java 。 , ,
(三)
Java : , 。
。
,Java , ,Java , 。
new 。
, Java 。
, , , 。
, 。
(四)
heap : new
stack : 。
data segment: , 。
code segment:
(五)
String str = new String("test");
, new "test" String , str
"test" , str "test" 。
Java , 。 str , , , , , , Gc gc 。
。
(六)
,
(int,short) ,
, , GC
(七)
, , , ,Java 。 , , 。
, , , 。 , , 。 (,int, short, long, byte, float, double, boolean, char) 。
(八)
>>> 。 RAM( ) , “ ” 。 , ; , 。 、 , 。 ,Java “ ” “ ”。 , 。 , Java —— , Java 。
>>> 。 ( RAM ), Java 。 ,“ ” “ ”(Heap) , 。 , 。 , new 。 , 。 , , : !
(九)
一、予備知識—プログラムのメモリ割り当て c/C++でコンパイルされたプログラムが消費するメモリは、以下の部分に分けられます. 1、スタック領域(stack)-コンパイラによって自動的に割り当てられて解放され、関数のパラメータ値、ローカル変数の値などが格納されます.その動作はデータ構造のスタックに似ています. 2、ヒープエリア(heap)—一般的にプログラマーによって割り当てられて解放されるが、プログラマーが解放されない場合、プログラムの終了時にOSによって回収される可能性がある.データ構造中のヒープとは別物であることに注意し、割り当て方はチェーンテーブルに似ているが、ほほほ. 3、グローバル領域(静的領域)(static)―グローバル変数と静的変数の記憶は一つのブロックに置かれ、初期化されたグローバル変数と静的変数は一つの領域にあり、初期化されていないグローバル変数と初期化されていない静的変数は隣の別のブロック領域にある. 4、文字定数領域-定数文字列はここに置いてあります.プログラムが終わったらシステムから解放されます. 5、プログラムコード領域-関数体のバイナリコードを保存する. 二、例プログラム これは先輩が書いたもので、とても詳しいです. //main.cpp int a=0;グローバル初期化領域 char*p 1;グローバル未初期化領域 main() { int b;スタック char s[]=「abc」;スタック char*p 2;スタック char*p 3="123456";123456は定数領域で、p 3はスタック上にある. static int c=0;グローバル(静的)初期化領域 p1 = (char *)malloc(10); p2 = (char *)malloc(20); 10バイトと20バイトが割り当てられた領域はスタック領域にあります. strcpy(p 1、「123456」)、123456は定数領域に配置され、コンパイラはp 3が指す「123456」と1つの場所に最適化される可能性がある. }
二、スタックとスタックの理論知識 2.1申請方式 stack: システムによって自動的に割り当てられます.たとえば、関数内のローカル変数int bを宣言します.システムはスタック内でbの空間を自動的に開きます. heap: プログラマーが自分で申請し、サイズを指定し、cでmalloc関数を指定する必要があります. 例えばp 1=(char*)malloc(10); C++でnew演算子を使う 例えばp 2=(char*)malloc(10); ただし、p 1、p 2自体はスタック内にあることに注意してください. 2.2 申請後のシステムの応答 スタック:スタックの残りの領域が申請された領域より大きい場合、システムはプログラムにメモリを提供します.そうしないと、例外プロンプトスタックがオーバーフローします. ヒープ:まず、オペレーティングシステムに空きメモリアドレスを記録するチェーンテーブルがあることを知っておく必要があります.システムがプログラムの申請を受け取ったとき、 チェーンテーブルを巡回し、最初の空間が申請された空間より大きいスタックノードを探し、そのノードを空きノードチェーンテーブルから削除し、そのノードの空間をプログラムに割り当てます.また、ほとんどのシステムでは、このメモリ空間の最初のアドレスに今回の割り当てのサイズが記録されます.これにより、コードのdelete文がメモリ空間を正しく解放することができます.また,見つかったスタックポイントの大きさが申請の大きさに等しいとは限らないため,余分な部分を自動的に空きチェーンテーブルに再配置する. 2.3申請サイズの制限 スタック:Windowsでは、スタックは低アドレスに拡張されたデータ構造で、連続したメモリの領域です.スタックトップのアドレスとスタックの最大容量はシステムで予め定められており、WINDOWSではスタックの大きさは2 M(1 Mということもありますが、つまりコンパイル時に決定される定数)リクエストされたスペースがスタックの残りのスペースを超えた場合、overflowが提示されます.したがって、スタックから取得できるスペースは小さくなります. ≪ヒープ|Heap|oem_src≫:ヒープは、高アドレスに拡張されたデータ構造であり、不連続なメモリ領域である.これは、システムがチェーン・テーブルで格納する空きメモリ・アドレスであるため、当然不連続であり、チェーン・テーブルの遍歴方向は低アドレスから高アドレスである.ヒープの大きさは、コンピュータ・システムで有効な仮想メモリに制限されている.このことから、ヒープが得る空間は比較的柔軟であり、比較的大きいことがわかる. 2.4申請効率の比較: スタックはシステムによって自動的に割り当てられ、速度が速い.しかし、プログラマーは制御できない. スタックはnewで割り当てるメモリで、一般的に速度が遅く、メモリの破片が発生しやすいが、最も使いやすい. また、WINDOWSでは、VirtualAllocでメモリを割り当てるのがベストです.彼はスタックではなく、スタックではなく、プロセスのアドレス空間に直接高速メモリを残すのではなく、最も使いにくいですが、速度が速く、最も柔軟です. 2.5スタックおよびスタック内のストレージ スタック:関数呼び出しの場合、最初にスタックされるのは、メイン関数の次の命令(関数呼び出し文の次の実行可能文)のアドレスです.次に、関数の各パラメータです.ほとんどのCコンパイラでは、パラメータは右から左にスタックされ、関数のローカル変数になります.静的変数はスタックに入らないことに注意してください. 今回の関数呼び出しが終了すると、ローカル変数は先にスタックを出て、それからパラメータで、最後にスタックトップポインタは最も最初に保存されたアドレス、つまりメイン関数の次の命令を指し、プログラムはこの点から実行を継続します. ≪ヒープ|Heap|emdw≫:通常、ヒープのヘッダにヒープのサイズを1バイトで格納します.ヒープの具体的な内容はプログラマが手配します. 2.6アクセス効率の比較 char s1[] = "aaaaaaaaaaaaaaa"; char *s2 = "bbbbbbbbbbbbbbbbb"; aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbはコンパイル時に確定した. しかしながら、以降のアクセスでは、スタック上の配列はポインタが指す文字列(例えばスタック)よりも速い. 例: #include