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

このQ&Aのポイント
  • Javaコレクションフレームワークのクラス型とインタフェース型の使い分けについてを解説します。
  • クラス型とインタフェース型の使い分けは、個々の要件や制約によって異なります。
  • インタフェース型の方がメソッドの種類が多いですが、抽象メソッドなのでオーバーライドして使うことができます。
回答を見る
  • ベストアンサー

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
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • foxa-gogo
  • ベストアンサー率44% (38/85)
回答No.1

基本的にはインターフェースを使うのがよく、特別な必要があるときのみクラス型の変数を使います。 これは、第一にはインターフェース型の変数を使用していれば、実装にしばられず、必要があれば使用するインスタンスのクラス(実装クラス)を挿げ替えることができるからです。 なお、インターフェースしか使えない、ということはありませんし、実装クラスをインターフェースに代入したからといって使えるメソッドの種類が増えることもありません。 例えば、Queue<E> queue = new LinkedList<E>();のようにQueueインターフェースを使えば、LinkedListに備わっているメソッドの一部は使えなくなりますが、これは「良いこと」とされます。Queueインターフェースを使うことで、このオブジェクトがキューとして使われることが自然に保障され、余計なバグを埋め込む余地が減ったりといったメリットがあるからです。

pochi1234
質問者

お礼

とても勉強になりました、ありがとうございます。

関連するQ&A

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

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

    • ベストアンサー
    • Java
  • Java : インターフェースについて

    List<String> list = new LinkedList<String>(); という宣言がありますが、これは本当に意味があるのでしょうか? 「呼び出し側が LinkedList の実装コードを意識せずにメソッドを呼び出すことができ、呼び出し側コードの再利用性と抽象性を高めることができる」 ということが考えとしてあるのかもしれませんが、この正当性がイマイチ理解できません。少なくとも、呼び出し側のコードも、ある程度は LinkedList か ArrayList かは考慮した上でのコードディングをしていないでしょうか(ランダムアクセスしやすいうんぬん)。List で宣言されていることにどれだけの意味があるのでしょうか? また、実際問題、list のメソッド使った際 Eclipse のコードジャンプで LinkedList の実装コードが一発で見れないため、どのような実装になっているのか調べたいときにすぐに確認できないというのも個人的には問題に感じます。 この宣言に本当に意味はありますか?本当に抽象化できていますか? 詳しい方よろしくお願いいたします。

  • 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(); ご教授いただけますと幸いです。 宜しくお願いいたします。

  • コレクションクラスについて

    ●下記のコードについて質問があります import java.util.*; public class Test { public static void main(String args[]) { ArrayList<ObjectOne> list = new ArrayList<ObjectOne>(); list.add(new ObjectOne()); list.add(new ObjectOne()); list.add(new ObjectOne()); Collections.sort(list); } } class ObjectOne { private int x = 0; private int y = 0; } このソースをコンパイルすると、 シンボル: メソッド sort(java.util.ArrayList<ObjectOne>) 場所 : java.util.Collections の クラス Collections.sort(list); と、エラーが表示されてしまいます。 java.util.*をインポートしているので、上記のようなエラーはでないと 思うのですが、うまくいかないです。おそらく、ObjectOneクラスで 何か処理漏れが起きているのかもしれませんが、エラーとなる原因を 特定することができません。 エラーとなる原因と解消する手立てを教えていただければと思っております。 宜しくお願い致します。 「追記」 ArrayList<ObjectOne> list = new ArrayList<ObjectOne>(); の<ObjectOne>を消せばエラーはなくなりますが、 <ObjectOne>を消さない方針で考えがあればと思っております。

  • インターフェイスと抽象クラス

    なかなか理解が難しくて苦しんでいます。 で自分なりに理解したのですが、 抽象クラス→内容に決まっているメソッドと決まっていないメソッドがある場合に決まっていないメソッドを あとからオーバーライドするだけでスーパークラスで定義したすべてのメソッドを利用できる。 これでただしいでしょうか? で、インターフェイスなのですが、この抽象クラスとそっくりなんですが、 (1)変数は定数になる(強制static)(2)メソッドは名前のみの宣言(内容は記述できない) と言うことで、かなり???なのです。 何のために・・・???記述するんでしょうか?? ただひとつメリットがあるとしたら、インターフェイスを実装すると、インターフェイスの配列でインスタンスを 生成出来るということぐらいでしょうか。 そこでちょっとお門違いの疑問かもしれないんですが、 Runnable、やMouselistenerはメソッドの内容が書かれていないのに、 なぜ機能を持たせることが出来るのでしょう??? 認識違い、間違い等ありましたら、教えてください よろしくお願いいたします。

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

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

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

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

  • Java コレクション・ジェネリクスについて

    Javaのコレクション・ジェネリクスについてです。 以下のコードについて、私はa.y();でAインタフェイスにyメソッドがないため コンパイルエラーになるのではないかと思っているのですが(実際にエラーが出ている) 書籍では「実行されるがなにも表示されない」とあります。 もし私の考え方に間違いがあればご指摘いただけると幸いです。 ocj-pを受験目前なので切実です。 よろしくお願いいたします。 interface A { void x(); } class B implements A { public void x(){} public void y(){} } class C extends B public void x(){} } public class D { public static void main(String[] args) { List<A> list = new ArrayList<A>(); list.add(new B()); list.add(new C()); for(A a : list) { a.x(); a.y(); } } }

    • ベストアンサー
    • Java
  • VectorクラスとRunnableインターフェース

    こんにちわ。 Java初心者です。 Vector クラスとrunnable インタフェースを実装したスレッドを用いたプログラムを作成中で、自分でも中身が分からなくなってきたうえにMainメソッドの位置が分からなくなってしまいました; 名前の表示が実行できるようにどなたか修正をお願いいたします。 現段階のソースは以下です。 import java.util.*; public class NameList implements Runnable{ private Thread t = null; private Vector list = new Vector(); public void Name(){ List<String> list = new ArrayList<String>(); list.add("Ayane"); list.add("Akiyo"); list.add("Asami"); list.add("Hanabi"); list.add("Meg"); list.add("Michiru"); list.add("Mika"); list.add("Reina"); } public void run(){ while (true){ System.out.println(list.get(0)); try{ Thread.sleep(1000); } catch (InterruptedException e){ break; } } } public void start(){ if(t == null){ t = new Thread(this); t.start(); } } }

    • ベストアンサー
    • Java
  • ArrayList内HashMapの取得

    基本的で申し訳ないのですが一番下の行で リストの3つめの要素内のkey=key2でyeahをコンソールに出力したいです。 どのように取得すればいいのでしょうか? list.get(2).get("key2")っぽいかんじで... ArrayList list = new ArrayList(); for (int i = 0; i < 5; i++) { HashMap map = new HashMap(); map.put("key1", "hello"); map.put("key2", "yeah"); map.put("key3", "boo"); list.add(map); } System.out.println(list.get(2));

    • ベストアンサー
    • Java

専門家に質問してみよう