- PR -

どちらがメモリを使うのでしょうか?

1
投稿者投稿内容
ニック名前
会議室デビュー日: 2005/03/24
投稿数: 11
投稿日時: 2005-03-24 17:30
ども。

サイズ1000のString配列と
サイズ1000のArrayListではどちらがメモリを使うのでしょうか?

文字列の配列を作ろうとした時に疑問におもいました。
ArrayListは"IndexOf()"メソッドや動的に後から"add()"メソッドなどで
後付けできるので便利なのですが。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-03-24 17:47
実際に試してみてはいかがでしょうか?
また、ArrayList のソースコードを確認してみるのも良いですね。

[ メッセージ編集済み 編集者: インギ 編集日時 2005-03-24 17:48 ]
jack_pma
常連さん
会議室デビュー日: 2002/11/15
投稿数: 35
お住まい・勤務地: 埼玉
投稿日時: 2005-03-24 17:50
APIリファレンスにも書いてあると思うし、ソース読んでも解るけど、ArrayListの中身は配列です。StringじゃなくてObject配列ではあるけど、配列を内包しているので配列のメモリ消費量プラスアルファって感じになりそうに見えます。あと、ArrayListは実際に要素を保持している量よりもある程度余裕を持った配列を生成していたはずなので、その分も若干多くなるはずです。

ただ、どのみち大差があるわけでもないので、indexOfとかaddなどのメソッドが必要な場合は迷わずArrayListを選んだほうが楽で安全だと思いますよ。配列サイズの拡張が必要になった場合の処理(配列を作り直してコピー)って面倒ですし、それはまさにArrayListがやってくれることですからね。

[ メッセージ編集済み 編集者: jack_pma 編集日時 2005-03-24 17:53 ]
ニック名前
会議室デビュー日: 2005/03/24
投稿数: 11
投稿日時: 2005-03-25 09:45
ども、インギさん、jack_pmaさんご意見いただきありがとうございます。
答えが遅くなりすみませんでした。

インギさん
>実際に試してみてはいかがでしょうか?
テストはしてみたんですがね、jack_pmaさんのおっしゃる通りに大差なかったのですよ。
でも、本当に?と思いまして。こんな使い方すると使用メモリに差はでますよ!とか、もしかしてあるのかな?と思い質問しました。

コード:
void btn_actionPerformed(ActionEvent e) {    
    System.out.println("---DEFAULT---");
    checkMemory();
    
    System.out.println("---STRING[1000]---");
    String[] str = new String[1000];
    for(int i = 0; i < str.length; i ++) { str[i] = String.valueOf(i); }
    checkMemory();
    
    System.out.println("---ARRAYLIST[1000]---");
    ArrayList arylist = new ArrayList();
    for(int i = 0; i < 1000; i ++) { arylist.add(String.valueOf(i)); }
    checkMemory();

  }
  
  public void checkMemory() {
    Runtime runtime = Runtime.getRuntime();
    System.out.println("TotalMemory: " + runtime.totalMemory() + " bytes.");
    runtime = Runtime.getRuntime();
    System.out.println("FreeMemory:  " + runtime.freeMemory() + " bytes.");
    runtime = Runtime.getRuntime();
    long usedmemory = runtime.totalMemory() - runtime.freeMemory();
    System.out.println("Used Memory: " + usedmemory + " bytes.");
  }


てな感じにテストしてみたら
---DEFAULT---
TotalMemory: 2031616 bytes.
FreeMemory: 1543552 bytes.
Used Memory: 488200 bytes.

---STRING[1000]---
TotalMemory: 2031616 bytes.
FreeMemory: 1492048 bytes.
Used Memory: 539832 bytes.

---ARRAYLIST[1000]---
TotalMemory: 2031616 bytes.
FreeMemory: 1431912 bytes.
Used Memory: 599840 bytes.
てな感じでした。使用するメモリには大差ないですよね。

jack_pmaさん
>ただ、どのみち大差があるわけでもないので、 indexOfとかaddなどのメソッドが必要な場合は迷わずArrayListを選んだほうが楽で安全だと思いますよ。配列サイズの拡張が必要になった場合の処理(配列を作り直してコピー)って面倒ですし、それはまさにArrayListがやってくれることですからね。

そうですか、メモリ的には大差ないので使い勝手で判断したほうが良いですね。
1

スキルアップ/キャリアアップ(JOB@IT)