DOBON.NET DOBON.NETプログラミング掲示板過去ログ

ArrayListについて

  • 題名: ArrayListについて
  • 著者: コブ
  • 日時: 2004/11/10 10:23:17
  • ID: 7265
  • この記事の返信元:
    • (なし)
  • この記事への返信:
  • ツリーを表示
環境/言語:[C#]
分類:[.NET]

大量のデータが格納されているArrayListが
複数ある場合。
使用しなくなったArrayListは”Clear()”
した方がいいのでしょうか??
■No7265に返信(コブさんの記事)
> 大量のデータが格納されているArrayListが
> 複数ある場合。
> 使用しなくなったArrayListは”Clear()”
> した方がいいのでしょうか??
Disposeをお勧めします。
> Disposeをお勧めします。

ArrayListにDispose()がないのですが。
■No7269に返信(コブさんの記事)
> ArrayListにDispose()がないのですが。

純粋に、Dispose()メソッドを使えという意味で、おっしゃったのではないかも...

スコープ範囲と、メモリ使用量が実際どんなものかにも因るかも。

# 私は、ArrayListは嫌いなので使ってませんが...

> ■No7269に返信(コブさんの記事)
>>ArrayListにDispose()がないのですが。
Dispose()がなければ Nothing でよいと思います。

■No7270に返信(java.lang.Nullpoさんの記事)

> # 私は、ArrayListは嫌いなので使ってませんが...

代わりに何を使っているのでしょうか?
大変、非常に興味があります。...
■No7270に返信(java.lang.Nullpoさんの記事)
> # 私は、ArrayListは嫌いなので使ってませんが...

失礼でなければ、その理由を伺ってもよろしいでしょうか。

また、私も代わりに何を使っているのかお聞きしたいです。
■No7274に返信(rakiさんの記事)
> 失礼でなければ、その理由を伺ってもよろしいでしょうか。
いえいえ、失礼なんてとんでもございません。

ArrayListは、動的にサイズが変わる配列を使用する時は非常に楽です。
それは認めます。非常に便利です。

では何故嫌いなのか、私の勝手な理由を述べさせてもらいます。
(2ヶ月くらい前に調べた知識なので、間違いがあるかもしれません)

まず、スレッドセーフではない。
まあこれは、Synchronized()メソッドを使えばいいですし、
普通に使う分には、まったく問題がありません。

問題なのは、何でもかんでも有効な値として入ってしまうこと。
NULLポインタ(Nothing)が有効であることについては、
自作メソッドなどで、強制すれば良いのでいいのですが、
型の概念が薄いので、各要素を取り出す時は「ダウンキャスト」しなければならない。
型は無数にありますので、すべて対応するのが面倒。
GetTypeすればできないこともないのですが、重くなります。
型が一意ならば、ダウンキャストなどしたくないですから。


> また、私も代わりに何を使っているのかお聞きしたいです。

状況によって "代わり" ではない場合があることを断っておきます。
単に、私個人が嫌いと言っただけですので、「使うな」とは言いません。

型がちゃんと決定しているのなら、その型のArrayなラッパクラスを自作する。
もしくは、ArrayListクラスを継承して、上記問題を起きないように、
オーバライドするなり、追加するなり、隠蔽化するなり...

... って思っていたのですが、間違ってますのでしょうか?
当方、若輩者(.NET初めて、4ヶ月くらい)ですので、
間違っているならば今後のためにもご指摘くださいませ。m(_ _)m
■No7276に返信(java.lang.Nullpoさんの記事)
> 問題なのは、何でもかんでも有効な値として入ってしまうこと。
> 型が一意ならば、ダウンキャストなどしたくないですから。

なるほど。
確かにその通りだと思います。


> 型がちゃんと決定しているのなら、その型のArrayなラッパクラスを自作する。
> もしくは、ArrayListクラスを継承して、上記問題を起きないように、
> オーバライドするなり、追加するなり、隠蔽化するなり...

これは私も良くやっています。
というより、こちらが多いでしょうか。
処理速度が変わるかどうかは計っていない為正確には分かりませんが、
少なくともコーディングミスは防げますので。


> 当方、若輩者(.NET初めて、4ヶ月くらい)ですので、
> 間違っているならば今後のためにもご指摘くださいませ。m(_ _)m

私もまだまだ若輩者ゆえ、
java.lang.Nullpoさんの発言が間違っているかどうかは分かりませんが、
私の知らない何か別の問題があるのかも?と少し不安になったため、
質問させていただきました。
お答え頂きありがとうございました。

#サイト公開心待ちにしております。
みなさん、こんにちは。

まず最初に誤っておきます。ごめんなさい。
disposeメソッドはArrayListにはありません。
ArrayListもクラスなので、純粋にDisposeメソッドがあるものだと思い込んでいましたが、実装されていませんでした。
で、調べてみましたが、当初の質問「使用しなくなったArrayListは”Clear()”
した方がいいのでしょうか??」
は、半分「Yes」です。
Disposeメソッドに近い処理としては、
1.Clearメソッドの実行
2.TrimToSizeメソッドの実行
を行うことで、メモリを最小化する事ができます。ただ、Disposeのように破棄をする訳ではないので、注意してください。

■No7276に返信(java.lang.Nullpoさんの記事)
> ■No7274に返信(rakiさんの記事)
>>失礼でなければ、その理由を伺ってもよろしいでしょうか。
> いえいえ、失礼なんてとんでもございません。
>
> ArrayListは、動的にサイズが変わる配列を使用する時は非常に楽です。
> それは認めます。非常に便利です。
>
> では何故嫌いなのか、私の勝手な理由を述べさせてもらいます。
> (2ヶ月くらい前に調べた知識なので、間違いがあるかもしれません)
>
> まず、スレッドセーフではない。
> まあこれは、Synchronized()メソッドを使えばいいですし、
> 普通に使う分には、まったく問題がありません。
>
> 問題なのは、何でもかんでも有効な値として入ってしまうこと。
> NULLポインタ(Nothing)が有効であることについては、
> 自作メソッドなどで、強制すれば良いのでいいのですが、
> 型の概念が薄いので、各要素を取り出す時は「ダウンキャスト」しなければならない。
> 型は無数にありますので、すべて対応するのが面倒。
> GetTypeすればできないこともないのですが、重くなります。
> 型が一意ならば、ダウンキャストなどしたくないですから。
確かにデータを有効利用するにはキャストが必要ですので、重いのは確かです。
ただ、今後、VS2005に実装される、ジェネリックによって、ある程度解消されると思われます。

>>また、私も代わりに何を使っているのかお聞きしたいです。
>
> 状況によって "代わり" ではない場合があることを断っておきます。
> 単に、私個人が嫌いと言っただけですので、「使うな」とは言いません。
>
> 型がちゃんと決定しているのなら、その型のArrayなラッパクラスを自作する。
> もしくは、ArrayListクラスを継承して、上記問題を起きないように、
> オーバライドするなり、追加するなり、隠蔽化するなり...
私もjava.lang.Nullpoさんと同意権です。
型がはっきりしているなら...System.Collectionsというクラスがあるのですから、DictionaryBaseを使う方がいいかもしれませんが、そのあたりは作り手の拘りだと思います。
■No7278に返信(rakiさんの記事)
> > 型の概念が薄いので、各要素を取り出す時は「ダウンキャスト」しなければならない。
> > 型は無数にありますので、すべて対応するのが面倒。
> > GetTypeすればできないこともないのですが、重くなります。
> > 型が一意ならば、ダウンキャストなどしたくないですから。
> なるほど。
> 確かにその通りだと思います。
私はムダなことが嫌いなわりに、面倒なのも嫌いです。
そのためのラップを作るのは面倒なので、嫌いなのです。
あと、問題なのはグループ開発の時ですよね。バグの温床になりかねません。
適当に使う人がいますので、型の概念はハッキリさせるのに限ります。
柔軟をとるか、安全をとるかでしょうか...。(そのへんは作り手次第かなぁ)

> > 型がちゃんと決定しているのなら、その型のArrayなラッパクラスを自作する。
> > もしくは、ArrayListクラスを継承して、上記問題を起きないように、
> > オーバライドするなり、追加するなり、隠蔽化するなり...
> これは私も良くやっています。
> というより、こちらが多いでしょうか。
> 処理速度が変わるかどうかは計っていない為正確には分かりませんが、
> 少なくともコーディングミスは防げますので。
処理速度は体感するほど変わらないかもしれません。
ですが、ムダな処理を入れるのも何かイヤなものだと思いませんか?

「動的な配列」自体は、自作クラスで十分対応可能ですので、
私は逆で、ArrayListを継承する方法は使いません。
↓はそういう意味です。
> > 型がちゃんと決定しているのなら、その型のArrayなラッパクラスを自作する。

> > 当方、若輩者(.NET初めて、4ヶ月くらい)ですので、
> > 間違っているならば今後のためにもご指摘くださいませ。m(_ _)m
> 私もまだまだ若輩者ゆえ、
> java.lang.Nullpoさんの発言が間違っているかどうかは分かりませんが、
> 私の知らない何か別の問題があるのかも?と少し不安になったため、
> 質問させていただきました。
> お答え頂きありがとうございました。
うーん... ご存知だったのならば、フォロー側にまわって頂きたかったです(w
最近、忙しくてあまりココにも来れませんので...

> #サイト公開心待ちにしております。
まだ、全然完成から程遠いです(w


■No7273に返信(平ちゃんさんの記事)
> Dispose()がなければ Nothing でよいと思います。
その場で、開放が必要なくらいシビアならば、ですよね。
スコープから外れれば、GCがメモリを開放するので普通は心配無用なのかな。


■No7279に返信(ぺがらぼさん)
いつもいつも、フォロー感謝します。
サイトは、まだまだ先の話になりそうです...。
■No7283に返信(java.lang.Nullpoさんの記事)
> あと、問題なのはグループ開発の時ですよね。バグの温床になりかねません。
> 適当に使う人がいますので、型の概念はハッキリさせるのに限ります。
> 柔軟をとるか、安全をとるかでしょうか...。(そのへんは作り手次第かなぁ)

グループ開発の場合は安全を取るべきだと私は思っております。
が、これも時と場合によりますので、一概には言えませんが。
私は割と不明な点は潰して行くタイプなので。
でも、その為の労力が膨大になる場合、
面倒になって妥協してしまうんですけどね。


> 処理速度は体感するほど変わらないかもしれません。
> ですが、ムダな処理を入れるのも何かイヤなものだと思いませんか?

確かにその気持ちも良く分かります。
でも、自作クラスを作るのも面倒だったりするんですけどね。
って堂々巡り?


> うーん... ご存知だったのならば、フォロー側にまわって頂きたかったです(w
> 最近、忙しくてあまりココにも来れませんので...

すみません。私のなかでは
> スレッドセーフではない。
> 型の概念が薄いので、各要素を取り出す時は「ダウンキャスト」しなければならない。
というのはさほど『問題』ではないため、
その他の明らかに使用に不都合が生じる『問題』があるのかと思ったのです。
より安全な開発を行う為の『手間』が生じることは
私にとってさほど苦ではありませんから。
(その量によりますが)

これからはフォローできるよう頑張りますので
今回はお許し下さい。

DOBON.NET | プログラミング道 | プログラミング掲示板