• 締切済み

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()…

noname#189082
noname#189082
  • Java
  • 回答数2
  • ありがとう数0

みんなの回答

  • hitomura
  • ベストアンサー率48% (325/664)
回答No.2

> 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用の領域にそのインスタンスへの参照を格納。

noname#137197
noname#137197
回答No.1

> Sampleclass sc;//自作クラス Sampleclass のインスタンスを指すポインタ(4バイト)を確保しています。 > sc =new Sampleclass(); Sampleclass のインスタンスのメモリ使用量(これはクラスのメンバ変数の総量+パディング)を確保しています。 new したときに、以前作って廃棄されたSampleclass インスタンスの残骸がまだメモリ上にあれば(ガーベッジコレクタがまだ除去せずに残っているもの)、それを初期化して再利用されます(この場合メモリ使用量が増えない)。 ただJava の仕組みは基本的にエンド・デベロッパが意識する必要はないので、実は途方も無く簡素か超複雑怪奇な仕組みか、それは定かではありません。

関連するQ&A

  • String配列を扱うアルゴリズムについて

    よりパフォーマンスの良いアルゴリズムが、 ございましたらご教示下さい。 数レコード分のDBテーブルデータが格納されたString[][]型が存在するとします。 配列の要素は、String[行(フィールド)][列(カラム)]です。 ここで、全レコード中の列ごとの最大文字列長を int[]型に取得したいと思います。 そうした場合、自作した下記の処理よりも、 よいパフォーマンスを得られるアルゴリズムがございましたら、 ご教示願いたいと思います。 ※処理前提条件 ●String[][]型変数に、過不足無くテーブルデータが格納済みであるとします。 ●配列の第一(行)・第二(列)要素の最大値は取得済みであるとします。 ////////////// // 変数定義 // ////////////// String[][] tableData; ← テーブルデータ格納済み(過不足はありません) int 行数 = 全行数(取得済み); int 列数 = 全列数(取得済み); //列毎の最長文字列値を格納する。 int[] maxLen = new int[列数]; ////////// // 処理 // ////////// //列の個数分、処理を繰り返す for(int i = 0; i < 列数; i++) {   //行の個数分、処理を繰り返す   for(int j = 0; j < 行数; j++) {     //NULLを回避する     if(tableData[i][j] != null) {       //int配列に格納済みの数値より大きければ、改めて格納する       if(maxLen[i] < tableData[i][j].length()) {         maxLen[i] = tableData[i][j].length();       }     }   } } 以上です、どなかお知恵をお貸し頂けませんか。 宜しくお願い致します。

    • ベストアンサー
    • Java
  • Javaの文字列配列について質問です

    あは1行目の1つめです。 かは2行目の1つめです。 さは3行目の1つめです。 と表示させたいのですが、 Exception in thread "main" java.lang.NullPointerException at Nihongo.main(Nihongo.java:22) と出てきて出来ません。 どこが悪いのでしょうか? 22行目は「s[i].easyNihongo();」です。 class Hiragana { String boin; int num; int kaz; Hiragana(String b, int n, int k){ boin = b; num = n; kaz = k; } void easyNihongo(){ System.out.println(boin+"は"+num+"行目の"+kaz+"つ目です。"); } } class Nihongo{ public static void main(String [] args){ String aiueo[] = {"あ", "か", "さ"}; Hiragana [] s = new Hiragana[3]; for(int i=0; i<s.length; i++){ s[i] = new Hiragana(aiueo[i], 1, i++); s[i].easyNihongo(); } } }

    • ベストアンサー
    • Java
  • javaについて

    キーボードから入力をして、その後str[0][0]とstr[1][0]の文字を繋げたいのですがエラーとなってしまいます。どう変えたらよいでしょうか。 以下がプログラムです。 import java.io.*; import java.lang.*; import java.net.*; import java.awt.*; class gugu3 { public static void main(String[] args) throws IOException { int KEYWORDMAX=10; int CNTMAX=100; String [][]str = new String[KEYWORDMAX][CNTMAX]; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String line=null; for (int i=0;i<KEYWORDMAX;i++){ System.out.println("第"+(i+1)+"番目のキーワードを設定しますか?(y/n)"); line=br.readLine(); if(line.equals("n")) break; for (int s=0;s<CNTMAX;s++){ System.out.println("キーワードを入力してください(終了=0)"); line=br.readLine(); if(line.equals("0"))break; str[s][i]=line; } } String keyword = new String(str[0][0]" "str[1][0]); System.out.println("キーワードは "+keyword); } } 以下はエラー表示です。 gugu3.java:24: ')' がありません。 String keyword = new String(str[0][0]" "str[1][0]); ^ gugu3.java:24: 文ではありません。 String keyword = new String(str[0][0]" "str[1][0]); ^ gugu3.java:24: ';' がありません。 String keyword = new String(str[0][0]" "str[1][0]); ^ エラー 3 個

    • ベストアンサー
    • Java
  • Stringオブジェクトについて

    ある参考書では、Java のメモリー使用効率を改善するために、JVM は「String 定数プール」と呼ばれる特別なメモリー領域を確保していると書いてあり、String を作成する例として次の2つのパターンのコードについて説明している(この例では、定数プール内にほかのString は存在しないものとしている)。 ・パターン(1) String s = "abc"; // 1つのString オブジェクトと         // 1つの参照変数を作成する この例では、"abc" がプールに納められ、変数s がそれを参照する。 ・パターン(2) String s = new String("abc"); // 2つのString オブジェクトと                  // 1つの参照変数を作成する。 このコードでは、new キーワードを使ったので、新しいString オブジェクトが標準の(プールでない)メモリー上に作成され、変数s がそれを参照する。さらに、リテラル"abc" がプールに収められる。  そこで質問ですが、パターン(2) で、変数s と2つのオブジェクトはそれぞれ互いにどのような関係(メモリー上の関係も含めて)を持っているのか。 例えば変数s に対してプリント命令を出したときにJVM はこの2つのオブジェクトに対してどのような処理をするのか。 またこれらのオブジェクトのhashcode はどうなっているのでしょうか。どなたか教えてください。

  • [至急!]Javaのプログラミング

    野球のBSOカウンタを作ろうとしているのですが、エラーが出ないもののうまく動きません。動作としてはsと入力したらSのカウンタに「〇」を表示、といったことをO(アウト)カウンタが3つになるまで行うプログラムなのですが、入力と出力の両方をうまくループすることが出来ません。分かる方がいたら教えてください。私が作ったものは下のものです。これを改良して作っていただけると助かります。 import java.io.*; public class test1 { public static void main(String[] args) throws IOException { BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); //String str=br.readLine(); //char hantei=str.charAt(0); int sc=0,bc=0,oc=0; while(oc<3){ String str=br.readLine(); char hantei=str.charAt(0); if(hantei=='s') { sc=sc+1; if(sc==3) oc=oc+1; sc=0; bc=0; } else if(hantei=='b') { bc=bc+1; if(bc==4) sc=0; bc=0; } else if(hantei=='o') { oc=oc+1; sc=0; bc=0; } else { System.out.println("入力が違います。"); } } System.out.print("B "); for(int i=0;i<=bc;i++){ System.out.print("〇"); } System.out.println(""); System.out.print("S "); for(int i=0;i<=sc;i++){ System.out.print("〇"); } System.out.println(""); System.out.print("O "); for(int i=0;i<=oc;i++){ System.out.print("〇"); } System.out.println(""); } } 出力例 s(入力) B S 〇 O s(入力) B S 〇〇 O s(入力) B S O 〇 これをアウトカウントが3つになるまで行うプログラムです。

    • ベストアンサー
    • Java
  • C#で string型の文字列で次の3つの処理をしたいのですが、具体的

    C#で string型の文字列で次の3つの処理をしたいのですが、具体的にどう記述すればよいでしょうか? string s = "ABCあいうDEおかFGHき"; int pos1 = ???? //(1)DEの位置を求める int pos2 = ???? //(2)FGHの位置を求める //(3)pos1とpos2を使って「おか」の文字列をtにセットする ????

  • javaで配列の格納をしたいです。

    配列の格納がうまくいきません。 javaについて質問させて頂きます。 ユーザーが数字を入力し配列 atr[ i ]に格納され 配列 v[ i ] に v[ 0 ] = count ... v[ 143 ] = count ... v[ 144 ] = count - 1 ... v[ 287 ] = count - 1 ... ... v[ count-288 ] = 2 ... v[ count-145 ] = 2 ... v[ count-144 ] = 1 ... v[ count-1 ] = 1 と、格納されるようなプログラムを作っています。 for文で作ろうと考えたのですが count, count-1 , ... 3, 2, 1と値を入れようと思いましたがうまくコンパイルが通りませんでした。 エラーは以下になります。 a.java:48: シンボルを見つけられません。 シンボル: メソッド readLine(int) 場所 : java.io.BufferedReader の クラス value = br_v.readLine(atr[i]); もし宜しければアドバイスやご指摘を頂けませんでしょうか。 説明も拙い部分がありますが宜しければお願いします。 import java.io.*; import java.util.Arrays; class a { public static void main(String[] args) throws IOException { int atr[]; atr = new int[25]; int count = 0; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); while(true){ //絶対に通る String str = br.readLine(); int res = Integer.parseInt(str); if(res == 0){ break; } else{ atr[count] = res; } count++; } for(int i=0; i<count; i++){ System.out.println(atr[i] + "が、選択されました。"); } int v[] = new int[25*144]; String value; try{ BufferedReader br_v = new BufferedReader(new InputStreamReader(System.in)); for(int i=count; i<count; i--){ value = br_v.readLine(atr[i]); v[i] = Integer.parseInt(value); } } catch(IOException e){ System.out.println("エラーです。"); } } }

  • Javaで配列を定義する方法

    こんにちは、片岡といいます。 Java言語で配列を定義する場合、以下の二つの書式に違いはありますか。 違いがあるとすれば、どのような違いですか。 また、違いがないのならば、どちらの記述がよいのですか。 ご存知の方はいらっしゃいませんか。 (1) public class Main1 { public static void main(String[] args) { String str[] = new String[] { new String("itiban"), new String("niban"), new String("sanban"), }; for (int i = 0; i < str.length; i++ ) { System.out.println(str[i]); } } } (2) public class Main2 { public static void main(String[] args) { String str[] = { new String("itiban"), new String("niban"), new String("sanban"), }; for (int i = 0; i < str.length; i++ ) { System.out.println(str[i]); } } } なお、私の環境は以下の通りです。 OS: Microsoft Windows XP Professional SP2 java: java version "1.4.2_13" 検索エンジンで"配列 オブジェクト java"を検索しましたが、 解決に役立つ情報は見つかりませんでした。

    • ベストアンサー
    • Java
  • WindowsのUNICODEをJavaのStringに変換したい

    Windowsからソケット通信でUNICODE(little endian)文字列を受け取っています。 bufferはバイト配列で格納されているとして String text= new String(buffer);とか String text= = new String(buffer,"MS932");とか String text= new String(buffer,0,長さ,"UNICODE"); などとするのですが漢字コードが化けてしまいます。 エンディアン並びを逆にしたりしましたがやはり同じです。 半角の場合、例えば「abc」なら「 a b c」と 0x0の部分がスペースになっていました。 ところでWindowsがメモ帳などではき出すunicodeはjavaのunicodeとは違う と聞きましたがどうなんでしょうか? 宜しくお願いします。 ※バイト配列をそのまま返すとそれをWindowsクライアントは表示するので 通信部分でバイト配列が壊れている事は考えにくいです。

    • ベストアンサー
    • Java
  • 素朴な疑問

    つまらない質問ですが int i; printf("%d",i); のように値を代入しないで実行するといつもへんな数が出てきます。 このときメモリの領域には何が格納されているんでしょうか?値を宣言しただけでもう領域にはなにかが書き込まれているということでしょうか?

専門家に質問してみよう