- 締切済み
JAVA String型のメモリ上の処理について
JAVA初心者です。 String s; s = "abc"; という処理で、それぞれ一行ずつの文はメモリ上ではどのようなことを行っているか分かりません。 また、 Sampleclass sc;//自作クラス sc =new Sampleclass(); だとString型と同じ処理が働いているのでしょうか? int型では int i; …メモリ領域の確保(4バイト)し、iを宣言。 i = 3; …メモリ領域のiに000……011を格納。 だと思いますが、どうも同じ考えでは無いようです。 メモリ上だとString,Sampleclassのそれぞれの行はどのようにメモリ上で動いているか教えて下さい。 よろしくお願い致します。 テンプレ String s… s = "abc"… Sampleclass sc… sc =new Sampleclass()…
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- hitomura
- ベストアンサー率48% (325/664)
> int型では > int i; …メモリ領域の確保(4バイト)し、iを宣言。 > i = 3; …メモリ領域のiに000……011を格納。 ちょっと処理が抜けているというかずれているかな?あと宣言は書いてある場所によって動作が違うけど、代入文が後に続くことから、何らかのメソッドの内部だとします。 int i; …メモリの局所変数用領域に4バイト(=int型のサイズ)分を確保し、int型i用の領域とする。 i = 3; …i用の領域にint型の値3を格納。 確かに3の内部表現は000……011ですが、3はリテラルとしてint型を持っています。それがすっぽり抜けているように思えます。 String s …メモリの局所変数用領域に???バイト(=String型への参照のサイズ)分を確保し、String型s用の領域とする。 参照がメモリ上でどのぐらいのサイズになるかは仕様で明記されていません。 s = "abc" …内容が"abc"のString型インスタンスを「用意」し、s用の領域にそのインスタンスへの参照を格納。 上記で「用意」と書いたのには理由があります。 http://www.y-adagio.com/public/standards/tr_javalang/3.doc.htm#101083 にあるとおり、"abc"という文字列が初出ならばJavaは新たなString型インスタンスを生成し、そうでないならばすでにある"abc"を保持するString型インスタンスを利用します。 Sampleclass sc …メモリの局所変数用領域に???バイト(=Sampleclass型への参照のサイズ)分を確保し、Sampleclass型sc用の領域とする。 sc =new Sampleclass() …ガーベッジコレクタが管理する領域にSampleclass型インスタンスを生成し、sc用の領域にそのインスタンスへの参照を格納。
> Sampleclass sc;//自作クラス Sampleclass のインスタンスを指すポインタ(4バイト)を確保しています。 > sc =new Sampleclass(); Sampleclass のインスタンスのメモリ使用量(これはクラスのメンバ変数の総量+パディング)を確保しています。 new したときに、以前作って廃棄されたSampleclass インスタンスの残骸がまだメモリ上にあれば(ガーベッジコレクタがまだ除去せずに残っているもの)、それを初期化して再利用されます(この場合メモリ使用量が増えない)。 ただJava の仕組みは基本的にエンド・デベロッパが意識する必要はないので、実は途方も無く簡素か超複雑怪奇な仕組みか、それは定かではありません。