• ベストアンサー

コレクションクラスの使い分け方

プログラミング初心者です。 コレクションクラスについて勉強中ですが、 1:ArrayListクラス(Listインターフェース) 2:HashSetクラス(Setインターフェース) 3:HashMapクラス(Mapインターフェース) 4:Vectorクラス 5:Iteratorインターフェース これらの違いがよく分かりません。 <質問1> 1と2の違いは、 1:順序付けて、重複オブジェクトを保持する 2:順不同で一意のオブジェクトを保持する というところまでは分かりました。 これらと3・4の違いって何でしょうか? <質問2> 5:ポインタを前後に動かすような感じで、保持したコレクションの中身を操作できる、 ということだと思いました。 1~4まででも、要素(インデックス)を指定しれやれば、中身を操作することはできると思うのですが、これを使ったほうがどのように便利なのでしょうか? 初歩的な質問で申し訳ありませんが、具体例などを示して教えていただければ助かります。 よろしくお願いします。

  • kutu
  • お礼率54% (152/279)
  • Java
  • 回答数5
  • ありがとう数0

質問者が選んだベストアンサー

  • ベストアンサー
  • lawson
  • ベストアンサー率44% (29/65)
回答No.4

############################ No3さんの >後者のコレクションフレームワーク(ArrayListやHashMapなど)を使うようにしましょう。(理由としては、コレクションクラスはそもそも『スレッドセーフ』で、『オブジェクトが同期化される』ためです。一応、言葉だけでも覚えておいてください。) ############################ について、 http://oshiete1.goo.ne.jp/kotaeru.php3?q=855200 の回答に対するお礼で、新たに発生した質問事項と、 それに対してNo2での回答をご参考下さい。 1トランザクションが、1つのスレッドで簡潔してれば ArrayListを使った方が速いです。 後、公開メソッドの引数や戻り値の型は、 Listや、Mapインターフェース型や、 Iterator型など、できるだけ抽象度の高いものに するのがコツです。 以上。

その他の回答 (4)

回答No.5

List系は値のみを保持ちます Map系はキーと値のセットを保持します Set系はキーのみを保持ちます キーは重複を許しません 値は重複を許します と考えたらわかりやすいのではないでしょうか。 ArrayListとVectorはどちらもListで、機能差はほとんどありません。特別な事情がない限り速度の速いArrayListを使用します。 Iteratorはシーケンシャルにアクセスさせたい場合に使用します。逆に1番目とか5番目のみを取りたいという状況でもなければList系は使うべきではないかもしれません。なぜなら、ループ1回ごとにインデックスを加減算して上限値と比較するというのはコストもかかりますし無駄な処理ともいえますから。しかし実際にはループの回数が少なければコストは非常に小さいですし、昔の言語と似た記述なので親しみがありますからListのほうがよく使われます。

回答No.3

基本的に、「コレクションフレームワーク」というのは、大雑把に言えば、「データ構造に関するフレームワーク」であるように思います。なので、コレクションの違いが良くわからない、というのは、つまるところ、データ構造についてよくわからない、と言っているのと同じですね。 まず始めに、厳密には「コレクションクラス」と「コレクションフレームワーク」とは、全然違います。簡単に言えば、前者のグレードアップしたものが後者と、考えればいいでしょう。それから、前者のコレクションクラス(VectorやHashtableなど)については、非推奨とされたりしているので、今後は極力使用せずに、後者のコレクションフレームワーク(ArrayListやHashMapなど)を使うようにしましょう。(理由としては、コレクションクラスはそもそも『スレッドセーフ』で、『オブジェクトが同期化される』ためです。一応、言葉だけでも覚えておいてください。) 以下、お勧め過去ログとお勧めサイトです。 ArrayListとLinkedListについて→ http://oshiete1.goo.ne.jp/kotaeru.php3?q=1420700 Iteratorの用途→ http://oshiete1.goo.ne.jp/kotaeru.php3?q=1657570 基本的なデータ構造についても説明されています。→ http://www.nextindex.net/java/collection/ 表形式で分りやすく解説されています。→ http://www.hellohiro.com/collections.htm J2SDKのバージョン情報なども明記されています。→ http://www.javaroad.jp/java_collection1.htm 上級者向け→ http://rat.cis.k.hosei.ac.jp/article/java/index.html (第2回では、実装クラスごとに「使用する場面」が説明されており、第3回では、コレクションフレームワークにおけるスレッドセーフの実現について、述べられています。) あと、Iteratorに関しては、以下のサイトを元に、デザインパターンの一つである「Iteratorパターン」について、理解を試みてください。 http://www.techscore.com/tech/DesignPattern/Iterator.html

  • lawson
  • ベストアンサー率44% (29/65)
回答No.2

ArrayListとVector はArrayListがスピードが速い。 Vectorだと、同期制御してくれる。 IteratorはIteratorが取れるデータ構造を ラッピングしたコンポーネントを 外部から使うときに、使ってる側は 具体的なデータ構造を知ってることに依存しない コードが書けるので保守性が向上する。 たとえば、 とりあえず、ベタで初期化ロジックを LinkedHashMapとかで書いといたけど、 後で設定情報情報をファイルやDBからとるように 内部ロジックを変えても、 イテレーションがとれるものでロジックを 書いてIteratorを返却しておけば、 使ってる側のコードを直す必要なし。 HashMapもイテレーションがとれた、 LinkedHashMapは順序が保障された イテレーションがとれたかなぁ Setはよくしらねぇ。 たぶん重複を許さないから、冗長を排除する ロジックを自作する手間を省ために、 使ってやってもいいような気がするなぁって 感じかな。 あとは、自分で。

noname#86752
noname#86752
回答No.1

<質問1への回答> HashMapはMap、VectorはListですね。 Mapはキーとオブジェクトのペアで値を持っています。(Setと似ている) Listは単に値を持っているだけです。(当然ですが同じListを実装しているArrayListと似ている) <質問2への回答> 例えばListの中に実際は10個の要素しかなくても11個目をくれというプログラムを組むことが出来ます。ところがIteratorを使うとそういうミスは起きません。 つまりプログラマがミスをしにくくなるのです。 単純なループではミスはおきにくいですが、特にループの中でインデックスの値を操作するようなループを行った場合はミスがおきやすくなります。

関連するQ&A

  • Javaコレクションフレームワークの、クラス型とインタフェース型の使い分けについて

    Javaコレクションフレームワークの、クラス型とインタフェース型の使い分けについてですが、 newで作ったインスタンスを、 クラス型に代入する場合と、インタフェース型に代入する場合があるのですが、どちらを優先して使ったほうがいいですか? ※物によっては、インタフェース型しかつかえないとか、どちらでも良い場合とかいろいろあると思います。 また、インタフェース型のほうがメソッドの種類が若干多いですが、抽象メソッドなのでオーバーライドして使うからそれは関係ないのかな。 ・本に出てきた例 ArrayList<E> list = new ArrayList<E>(); List<E> list = new ArrayList<E>(); Queue<E> queue = new LinkedList<E>(); LinkedList<E> list = new LinkedList<E>(); LinkedList<E> stack = new LinkedList<E>(); Set<E> set = new HashSet<E>(); Map<E, M> map = new HashMap<E, M>();

    • ベストアンサー
    • Java
  • イテレータパターンの理解度チェック

    デザインパターンのイテレータパターンを勉強していて、自分の理解が正しいか気になるので質問です。以下、私の理解しているつもりのことです。正しいか否か、間違っている場合はその部分について解説を願いたいです! ・Concrete Collectionはデータの保持と管理しているクラスで、メソッドiteratorでIteretor型のオブジェクトさえ返せば、あとは使うConcrete Iteratorを用途にあわせて自由に選べたり、いろいろいじれる(?) ・Concrete Itteratorは走査方法で、昇順のそれや、降順のそれ、とびとびのそれなど事前に作っておいて、Concrete Collectionでどれを使うか選べる。それらの各クラスは完成されてて、不用意にさわってはいけない(?) ・Iterator Interfaceは、いろんな方法がある「走査」の代表のようなもので、Concrete Collectionのiteratorメソッドで返すのはどんなConcrete ItteratorでもこのIterator Interfaceの型にしておけば、Mainクラスなどから使う時、内部の余計なことを気にせずに使える。 ・Collection(Agrigate) Interfaceが何のためにあるか理解できません。どう役に立っているのか分かりません。 ・これは私の経験不足ですが、Interfaceについてあまり利用価値が分かりません。実際、どんな時Interfaceあって良かったと実感されますか? ・Iteratorパターンは、大容量をテキストを一文ずつ取り出すときなど、大きな量の配列などを一気に読むと重いので全部取り出さず使う分だけ取り出したりバックグラウンドで順次読んだりという時に使う。 ・Iteratorパターンを、実際どんな時に使われましたか?また、こういうときに使うべきという具体的な例を挙げてください。 宜しくお願いします。

    • ベストアンサー
    • Java
  • Collectionからの型変換について

    いつもお世話になっています。 Collectionについてなのですが、 Collection→配列は、可能ですが、 Collection→List,Mapはできないのでしょうか? ためしに、CollectionにList,Mapそれぞれを格納してみると Object[]で、List,Mapそれぞれの値を取得することはできるようなのですが。 以下が実行時のソースです。 //MapからCollection Map map = new HashMap(); map.put("tet","ttt"); map.put("a", "arigato~"); //MapをCollectionに格納する Collection co1 = java.util.Arrays.asList(map); //Object型配列で取得する Object[] ob1 = co1.toArray(); System.out.println(ob1.length + "/" + ob1[0]); //ListからCollection List list = new ArrayList(); list.add("test"); list.add("arigato~"); //ListをCollectionに格納する Collection co2 = java.util.Arrays.asList(list); //Object[]で取得する Object[] ob2 = co2.toArray(); System.out.println(ob2.length + "/ " + ob2[0]); 表示結果: 1/{a=arigato~, tet=ttt} 1/ {a=arigato~, tet=ttt} 宜しくお願いします。

    • ベストアンサー
    • Java
  • VectorとArrayListの違い

    お世話になっています。 VectorとArrayListやHashTableとHashMapなど、同期型と非同期型のクラスなどありますよね。 これらは具体的にどのようなときに使い分ければ良いのでしょうか? 私の考えでは、どの場面でもArrayListやHashMapを使っても問題ないと思ってしまいます。 マルチスレッドでスレッドが生成される前に生成されたListオブジェクトを参照した場合には予想と異なる動きをしそうですが、それ以外では全く問題ないように思います。 どの様に使い分ければよいのでしょうか?

    • ベストアンサー
    • Java
  • HashSetのデータをファイルにしたい

    HashSetのデータをファイル化したいのですが、どのようにすればよいでしょうか?以下のコードで画面出力は出来るのですが、BufferedWriterのwriteメソッドでファイルに追記したくてもそれぞれの文字列の長さはデータ毎にサイズが異なるためwrite(String s, int off, int len) が使えそうにありません。どうすればファイル化出来るでしょうか?もしくは、HashSetにこだわるつもりはないので、HashSet以外で、一意性を保証するコレクションクラスがあればそちらの書き方でも構いません。 public class TestHash { public static void main(String[] args) throws Exception { HashSet hs = new HashSet(); hs.add("aiueo"); hs.add("kakikukeko"); hs.add("sashisuseso"); Iterator it = hs.iterator(); FileWriter writer = new FileWriter("/home/taro/aaa.txt"); BufferedWriter bwriter = new BufferedWriter(writer); while(it.hasNext()) { System.out.println(it.next()); //画面出力はこれでOK bwriter.write(it.next()); //これはNG } bwriter.close(); } }

    • ベストアンサー
    • Java
  • Iteratorの用途

    先日Javaの講習会の中で「ArrayListやHashSetを使用してListあるいはSetに格納されている要素を表示していく」という例がありました。 また、ArrayListやHashSetのメソッドを使用して表示する場合と、Iteratorオブジェクトを生成して?Iterator経由で要素を表示する例も示されました。 結局、ArrayListやHashSetの持っているメソッドを使って要素を表示しても、Iterator経由で表示してもどちらでも「要素を表示する」という事に関しては可能だということまでは理解できました。 私が疑問に思ったのは『Iterator経由でないとできない事があるから、Iteratorオブジェクトを生成するためのメソッドがArrayListやHashSetにあるのでは?』と思ったのですが、講師に質問してみると「特にIteratorでしかできない事はない。Iteratorを使おうが使うまいが同じ」と言われました。 結局Iteratorというのは、何故存在するのですしょうか? こんなこと悩まなくても良いのかもしれませんが、気になったので質問させていただきました。 よろしくお願いします。

    • ベストアンサー
    • Java
  • 抽象クラスとインタフェースの違いは?

    基本的なことかもしれなのですが、疑問に思ったのですが、抽象クラスとインタフェースは、どういう違いがあるのでしょうか? 実際にそれぞれ定義してみるとあまり違いが無いような気がしてしまいます。 「抽象クラスは、抽象データ型を定義するもの」で「インターフェースは、オブジェクトのインターフェースを定義するもの」という解釈でいいのでしょうか? 意味的な違いはあっても実際は、同じもののような気がするのですが、どう違うのでしょうか?

    • ベストアンサー
    • Java
  • 「コレクション」の違い

    こんにちわ、コレクションの中で色々違いがわからないものがあるので質問させてください。 本題に入る前に確認ですが、List、Set、Mapは、 左から重複OK、重複NG、重複NG&キーで管理という考えでいいでしょうか? もし考え方が違っていたらご指摘ください。 本題に入らせていただきたいのですが、色々とある中の違いを教えてください。 ・ArrayListとLinkedList ・HashSet(Map)とTreeSet(Map) この違いがわかりません。 どうぞよろしくお願いします。

    • ベストアンサー
    • Java
  • 抽象クラスとインターフェースの使い分け

    抽象クラスとインターフェース、この2つの違い、使い分け方が未だにはっきりとはわかりません・・・ 抽象クラスもインターフェースも実装は持たず、抽象クラスはサブクラスで、インターフェースはそれをインプリメントしたクラスで実装を行うのですよね? 両者ともに言わば中身はなく外枠だけ定義されていると言えると思うのですが、だとしたらこの2つの違いや使い分けってどうなるのでしょうか。 抽象クラスでは部分的な実装を含められることや、インターフェースでは実装クラスが全てのメソッドを実装しなければいけない、複数実装できるといった使い方の違いしかないのでしょうか。 だとしたら実際に抽象クラスとして用意するのかインターフェースとして用意するのかの選択基準はなんなのでしょうか。 明確にこういう場合は抽象クラス、こういう場合はインターフェースなどと言った使い分けってあるのでしょうか。

  • Javaを勉強しています。

    現在、Javaの勉強中なので初歩的な質問ですみません。 #色々な本やググってみたのですが、未だ理解できないでいます。 Javaでは、たとえば(1)のように左辺(List)の型と右辺(ArrayList)の型が 違う場合でも問題なく使用できるようです。 (1)と(2)で何の違いがあるのか理解できておりません。 何が違うのでしょうか。 (1)List<Integer> i = new ArrayList<Integer>(); (2)ArrayList<Integer> i = new ArrayList<Integer>(); その類件としては以下があります。。 (3)Map y = new HashMap(); (4)HashMap y = new HashMap(); ご教授いただけますと幸いです。 宜しくお願いいたします。

専門家に質問してみよう