• ベストアンサー

javanoリストのオブジェクト作成について

リストのオブジェクトを作成するときに、 (1) List<Person> list = new ArrayList<Person>(); (2) ArrayList<Person> list = new ArrayList<Person>(); と二つの宣言の仕方をよく見かけるのですが、この二つは 何が違うのでしょうか。また、どのような場合にそれぞれ 使われることが多いのでしょうか。

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

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

例えばこんな感じです。 know_smthgさんが、「リンゴの皮をむく人」をコーディングしたとします。メソッドは、peel(Apple apple)です。 今度は、ナシの皮を向く人が必要になったとしましょう。また新たにナシの皮をむくコードを書くこともできますが、それでは二度手間です。 リンゴの皮をむくのも、ナシの皮をむくのも、みかんの皮をむくのも同じようにできるのなら、この際リンゴとナシとみかんに、「丸い果物」というインターフェースをimplementさせて、peel(RoundFruit rf)というメソッドを書いたほうが便利です。 この話では、ArrayListがリンゴ、Listが「丸い果物」にあたります。 一般に、コードは扱う対象について、最小限のことしか知らないようにコーディングすることが好ましいとされています。ほかの事は知らなくてもいいのだから、当然知らなくて損をすることはないし、知らなければ知らないほど一般に変更に強くなるからです。 例えば、上記の例では、別に「果物」であることをむく人が知る必要はないので、「丸くてむける」というインターフェースの作り方をすれば、じゃがいもにも使えてなお再利用性が向上するでしょう。 しかし、「知らない」コードを書くのは「知っている」コードを書くより大変で、複雑になりがちなので、むやみに「知らない」コードを書こうとしてプログラムを複雑にしないように気をつけなければいけません。低いコスト(時間、複雑性、パフォーマンスなど)で知らないコードを書けるなら、当然そうする、高いコストでしかかけないなら、将来変更が予想される場合にだけ知らないコードを頑張って書く、というのがベストプラクティスとされています。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • tty911
  • ベストアンサー率0% (0/2)
回答No.2

1の宣言を強く推奨します インターフェースの活用により、 プログラミングの自由度が格段に上がると思います。 最初のうちは気がつかないかもしれませんが、 今は習慣として1を心がけてください これはオブジェクト指向の醍醐味の一つです。 投稿者さんはオブジェクト指向をまだ理解できていないのですね。 説明するより、経験で体得できると思います そのうち、ソートしたくなったりHashに変換したくなるときが 来ると思います。 そうなると理解できると思います。 この回答スペースでは足りないので http://java.sun.com/javase/ja/6/docs/ja/technotes/guides/collections/index.html を参照してください がんばって

全文を見る
すると、全ての回答が全文表示されます。
noname#241087
noname#241087
回答No.1

■基本的に(1)を使っています。 Listはインタフェースで、ArrayListはこのListインタフェースを実装したクラスです。 したがって、ArrayListクラスにはListインタフェースで宣言されているメソッドが実装されていることが保証されます。 Javaの標準クラスにはLinkedListなどListインタフェースを実装したクラスが他にもあります。 http://java.sun.com/javase/ja/6/docs/ja/api/java/util/List.html ■ArrayListクラスには、Listインタフェースで宣言されているメソッドの他にもメソッドが定義されています(例.trimToSizeメソッド)。 そのようなメソッドを呼ぶ必要が本当にある場合は、(2)のように記述してそのメソッドを呼ぶことになるのだと思います。 ちなみに自分が(2)のように記述する必要に迫られたことは記憶にないです :) ArrayList<Person> personArrayList = new ArrayList<Person>(); personArrayList.trimToSize(); //呼ぶことができる。 List<Person> personList = new ArrayList<Person>(); personList.trimToSize(); //コンパイルエラー ■(1)のようにListインタフェースを使う方が良いとされる理由を説明するのは自分には難しいのですが、 「インターフェイスプログラミング」「疎結合」などがキーワードになると思います。 例えば、Listインタフェースの実装クラスをArrayListから LinkedListなどの他のListインタフェースを実装するクラスに変更したい場合、(1)の方が簡単です。 ▼(1)でArrayListからLinkedListに変更する場合、ArrayListをLinkedListに変更するだけでよい。 List<Person> personList = new ArrayList<Person>(); // new LinkedList<Person>(); //以下、personListの参照先がArrayListなのか //Listインタフェースを実装した他のクラスなのかを気にする必要はない。 ... ... personList.add(person); ▼(2)でArrayListからLinkedListに変更する場合、 ArrayList<Person> personList = new ArrayList<Person>(); を LinkedList<Person> personList = new LinkedList<Person>(); に変更するだけでよいかは以降のコードを調べないとわからない。 次のようにArrayList独自のメソッドが呼ばれているかもしれない。 personArrayList.trimToSize(); 人に説明するのは難しいですね :)

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 宣言とは違うオブジェクトを作成???

    初心者です、、、教えて下さいm_ _m 宣言したクラスと、実際に作成するオブジェクトが違うというのはどうゆう意味なんでしょうか? 例えば、 Sample01 s1 = new Sample02(); というような場合です…これの意味がわかりません。。。 というか宣言とは一体なんの役割があるのでしょうか? 宣言したクラスと作成するクラスが違うと矛盾などが起きたりしないのはどうしてなのでしょうか?

    • ベストアンサー
    • Java
  • Listに格納されたオブジェクトの属性毎に集計

    【1】 生徒(Student)クラスを生成し、住所(address)などを設定 【2】 1を、List型オブジェクトに格納。 【3】 2のListの中の生徒(Student)オブジェクトから、住所毎に集計する 3のやり方を教えて下さい。 例えば、以下のような感じです。 --------------------------------------------------- //【1】 Studentオブジェクトを大量に生成し、それぞれに住所などを設定 Student smith = new Student(); smith.setAddress("hongkong"); Student ken = new Student(); ken.setAddress("tokyo"); Student scott = new Student(); scott.setAddress("scottland"); (以下、同様)  ・  ・  ・ //【2】 生成した全てのStudentオブジェクトをListに格納していく。 List studentList = new ArrayList(); studentList.add(smith); studentList.add(ken); studentList.add(scott); (以下、同様)  ・  ・  ・ //【3】 ListオブジェクトからStudentオブジェクトを取得し、 //同じ住所毎に、集計する //<例> //hongkong--- 4900人 //tokyo--- 3800人 //scottland--- 4600人 --------------------------------------------------- 1や2は、すでに出来上がっていて、変更できない為、 3のやり方のみ教えて下さい。 (Studentオブジェクトが格納されたListオブジェクトが、既に存在することが前提) また、Studentオブジェクトが大量にある為、 処理が重くなる実装の仕方は避けたいです・・。 もし分かる方いましたら、よろしくお願いします。

    • ベストアンサー
    • Java
  • javaでリストにオブジェクトを入れたい

    ユーザー情報を配列にしたものをセッターを使い、オブジェクトをリストに入れる処理をしたいです。 例(yamada,pas1,山田) リストを使用しているのは後々他のユーザーを追加する予定の為です。 例(yamada,pas1,山田) (suzuki,pas2,鈴木) リストにlist.add("yamada")などと入力すれば表示させることが出来るのですが、 オブジェクトを入れるとうまくいきません。list.add(オブジェクト名); 実行するとコンソールに「GetUser@19e0bfd」のようなものが出てきます。どうすればよろしいでしょうか? ここから上は省略。カプセル化したゲッターセッターの処理をしています。 public static void main(String[] args){   GetUser gu = new GetUser();//ユーザー情報をnew      String name[]=new String[3];   name[0]="yamada";   name[1]="pas1";   name[2]="山田";   gu.setId(name[0]);   gu.setPass(name[1]);   gu.setName(name[2]);   List list = new ArrayList();   list.add(gu); }

    • ベストアンサー
    • Java
  • ArrayListはオブジェクトのポインタを渡している?

    ArrayListはオブジェクトのポインタを渡している? 例えば、一つのメソッド内に以下のように書くと、出力は最下部のようになります。 listに入れたモデルを取り出さずにModelを変更しても、listに入れたモデルを変更したのと同じことが出来ています。 C言語で言うところの(Cはあまり覚えていませんが…)、ポインタを渡しているようなイメージになるのでしょうか? --コード-- Model model1 = new Model("model1"); Model model2 = new Model("model2"); ArrayList list = new ArrayList<Model>(); list.add(model1); list.add(model2); showList(list); model1.setName("model1_"); showList(list); --出力-- model1 model2 model1_ model2

    • ベストアンサー
    • Java
  • クラスの作成 オブジェクトの生成 メンバ変数へのアクセス

    Person というクラスを宣言し、main メゾットで new 演算子を使ってPerson オブジェクトを作成。さらに、main メゾットでインスタンス変数に値を代入して表示したい。 Person クラスのインスタンス変数には、名前 年齢 給料 を用意する。 変数のデータ型は、順に String , int float です。 Person クラス以外で main メゾットを作成する。 初心者です、本は結構読んだのですが、なかなかわかりませんでした。 おしえてください。

    • ベストアンサー
    • Java
  • Listに格納されているオブジェクトの照合(パターンマッチング?)

    2つのListオブジェクトを比較して、 それぞれの要素に格納されているクラスの属性が 一致しているかどうか、また、格納されている順番が同じかどうかを 調べたいのですが・・。 例えば、以下のようなかんじです↓ 1. 比較するListオブジェクト(1):userList //Userオブジェクト生成 User user1 = new User(); user1.setUserID(2); User user2 = new User(); user2.setUserID(4); //UserオブジェクトをListに格納 List userList = new ArrayList(); userList.add(user1); userList.add(user2); 2. 比較するListオブジェクト(2):specialUserList ※1.と同じ要領で生成されたもの List specialUserList; 3. 1と2を比較する 比較内容は以下の通りです。 1のListオブジェクト(userList)は、 1番目の要素に、 UserID:2 を持つUserオブジェクト 2番目の要素 に、UserID:4 を持つUserオブジェクト が格納されていますが、 2のListオブジェクト(specialUserList)も、 これと同じ構成で格納されているかどうか調べたいのです。 例えば、 2のListオブジェクトも、 1番目の要素に、 UserID:2 を持つUserオブジェクト 2番目の要素 に、UserID:4 を持つUserオブジェクト が格納されていればOKとし、上記以外であれば、NGとします。 例えば、以下のような内容がNGです。 1番目の要素に、 UserID:1(※2以外) を持つUserオブジェクト 2番目の要素 に、UserID:8(※4以外)を持つUserオブジェクト つまり、List要素に格納されている内容と、その格納されている順番が、 1と2で同じかどうかを調べたいのです。 もし分かる方いましたら、お力をお貸しください・・・

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

    先ほども質問したのですが、新たな疑問がありまして 再度、質問します。 List ResultBeanList = new ArrayList(); なんですが、例えば ArryaList ResultBeanList = new ArrayList(); でも、OKなんでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • オブジェクトの作成

    あるHPで以下のようなことがかかれていました。 ------------------------------------------------- この例では Java 環境ですでに存在するクラスからオブジェクトを作成する。しばしば、 Java オブジェクトは次のような文で作成される。 Date today = new Date(); これにより、新規 Dateオブジェクトが作成される。 ------------------------------------------------- で、どれがオブジェクトなんですか? todayがオブジェクトなんでしょうか? BASICならわかるのですが、オブジェクト指向ってさっぱりまかりません。だれか助けてください。

    • ベストアンサー
    • Java
  • jspのListのListの表現方法について

    Listの中にListを入れる処理をJava側でしています。 そのListをリクエストに投げているのですが JSPでの表現方法がわかりません。 Java側では ArrayList[] a_list = new ArrayList[10]; a_list[j]= new ArrayList<Dto>(); a_list[j].add(list.get(i)); という感じで作っています。 logic:iterateをネストしても うまく取れません。 どなたか、分かりましたら、よろしくお願いします。

    • ベストアンサー
    • Java
  • Listオブジェクトを連結し、新しいListオブジェクト生成

    2つのListオブジェクトを連結して、 新たに1つのListオブジェクトを生成するのは、 どうすればいいのでしょうか? 1. ListオブジェクトA 2. ListオブジェクトB 3. ListオブジェクトC(1.と2,を連結して新規生成) ※1と2には全く変更を加えない。 また、この方法は、パフォーマンスが重くなるでしょうか?

    • ベストアンサー
    • Java