• ベストアンサー

VectorとArrayListの違い

Harry_の回答

  • Harry_
  • ベストアンサー率55% (36/65)
回答No.2

全ての場合で Vector,Hashtable を使用せず、ArrayList と HashMap のを利用するのが、 ある意味正しいと思います。 ArrayList は非同期ですが、そのために、 Collections.synchronizedList(new ArrayList()); というコードで、同期化されたリストを 取得可能な方法が提供されていますので、 Vector の存在は必須ではありません。 パフォーマンスの観点から見ると、一見同期が取られてない ArrayList が高速とも考えられますが、 内部のメソッド呼出がわずかに複雑であるなどの理由? で、Vector の方が高速だという実測結果もあるようです。 それでも Vector を使用しないというのは プログラミングスタイルの問題です。 Vector は、コレクションフレームワークという 一貫性のある優れた設計のフレームワークが Java に追加される前から存在するため、 elementAt など一貫性のない余計なメソッドが含まれています。 こういったメソッドの使用を許すと、Vector を List インターフェースを介して利用することが できなくなります。 コレクションフレームワークを設計した人にとっては、 Vector は邪魔だし、削除できるものならしたかった だろうと思います。

michikusa
質問者

補足

返事遅れまして、すいません。   確かに、コードから言ったらArrayListの方が きれいですね。   しかし…。実は同期、非同期っていう考え方が 良く分かっていません。 どのようなときに同期を取らなければならないのでしょうか。  

関連するQ&A

  • Vector、ArrayList、LinkedListについて

    JAVA PRESS vol.26に「Listインターフェースを実装したクラスは ArrayList,LinkedList,Vectorの3種類ですが、Java2ではVectorを 使う意味はほとんどないので、通常は残りの二つのクラスから選択 します」という記述があったのですが、なぜVectorを使う意味が ほとんど無いのでしょう? パっと見た限りVectorはメソッドが多くて使い勝手が良さそうな 便利そうなクラスだと思うし、「同期化」されるというのも 他の2クラスと違う点ですよね? 決して使う意味がない、とは思わないのですが。 みなさんはどうお考えでしょうか? よろしくお願い致します。

    • ベストアンサー
    • Java
  • ArrayListとHashMapを利用する問題について

    『問題』 (1)ArrayListのオブジェクトを生成する。 (2)「何回入力しますか?」と出力し、入力処理を行う。 (3)(2)で入力された回数分、以下の処理を行う。   1)HashMapのオブジェクトを生成する。   2)「名前を入力して下さい。」と出力し、入力処理を行う。 3)「性別を入力して下さい。」と出力し、入力処理を行う。   4)「性別を入力して下さい。」と出力し、入力処理を行う。 5) 1)で作成したHashMapに、それぞれ入力された 名前・年齢・性別を設定する。   6)値を設定したHashMapを(1)で作成したArrayListへ格納する。 (4)ArrayListの件数分、以下の処理を行う。   1)ArrayListより、HashMapを取得する。   2)取得したHashMapより、それぞれ設定されている 名前・年齢・性別を取得する。   3)HashMapより取得した名前・年齢・性別を出力する。 『実行結果』 何回入力しますか? 2 名前を入力して下さい。 iwata 年齢を入力して下さい。 27 性別を入力して下さい。 men 名前を入力して下さい。 hana 年齢を入力して下さい。 21 性別を入力して下さい。 women 名前=iwata 年齢=27 性別=men 名前=hana 年齢=21 性別=women 上記のようなプログラムを書く問題について質問します。 (3)までは自力で書けて実行結果もこの通りになったのですが、 (4)が分からずに、実行結果では値の部分がnullと出力されて しまいました。自分でもこの記述は間違っているというのは感じる のですが、どうしたら値がちゃんと格納されるのか分かりません。 「ArrayListより、HashMapを取得する。」←特にこの部分を どう記述してよいのか・・・ 分かる方、上記の部分の記述方法だけでも構わないので教えて下さい。 『自分で書いたプログラム』 import java.util.*; import java.io.*; public class Sample02{ public static void main(String[] args)throws IOException{ ArrayList list = new ArrayList(); System.out.println("何回で入力しますか?"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine(); int num = Integer.parseInt(str); for(int i=0; i<num; i++){ HashMap map = new HashMap(); System.out.println("名前を入力して下さい。"); String name = br.readLine(); System.out.println("年齢を入力して下さい。"); String age = br.readLine(); System.out.println("性別を入力して下さい。"); String sex= br.readLine(); map.put("名前", name); map.put("年齢",age); map.put("性別",sex); list.add(name); list.add(age); list.add(sex); } for(int i=0; i<num; i++){ HashMap map = new HashMap(); String name = (String)map.get("名前"); String age = (String)map.get("年齢"); String sex = (String)map.get("性別"); System.out.println("名前=" + name); System.out.println("年齢=" + age); System.out.println("性別=" + sex); } } }

    • ベストアンサー
    • Java
  • JSPでのArrayListの表示について困っています

    以下のようにしてスレッドNoが同じものだけ表示したいと考えております。 servletの「text」という変数にはすべての値が格納されているところまでは確認できました。 それをJSPにて表示したいのですが、どのようにすれば出力されるのかわかりません。 どなたかお教えいただければと思います。 宜しく御願い致します。 --------------------------------------------------------- java /** * *TEXTテーブルからスレッドNoが同じものを返すメソッド * * */ public ArrayList selecttext(int no)throws SQLException{ ArrayList<Textbeen> list = new ArrayList<Textbeen>(); TextDAO kei =new TextDAO(); Connection db=kei.createConnection(); Statement sttSql=db.createStatement(); ResultSet rs=sttSql.executeQuery("SELECT * FROM TEXT WHERE KB_TH_NO='"+no+"' "); while(rs.next()){ String name=rs.getString("KB_NAME"); String tino =rs.getString("KB_TITLE_NO"); String title = rs.getString("KB_TITLE"); String mail = rs.getString("KB_MAIL"); String text = rs.getString("KB_TEXT"); String pass = rs.getString("KB_TITLE_PASS"); String date = rs.getString("KB_TIME"); int th_no = rs.getInt("KB_TH_NO"); Textbeen thread = new Textbeen(name, title, tino, mail, text, pass, date, th_no); //TO(Threadオブジェクト)を、保持するリストに追加 list.add(thread); } kei.closeConnection(db); return list; } ---------------------------------------------------------- servlet ArrayList text = new ArrayList(); try{ text = list.selecttext(TH_no); } catch(Exception e){ e.getStackTrace(); } request.setAttribute("test", text); String nextPage = "/view/user/ThreadTop.jsp"; ----------------------------------------------------------

  • ArrayListのバージョン変換

    今、JAVAを勉強しているのですが、環境の問題でJAVA1.4しか使えません。 しかし、市販の本を購入し、プログラムを書いて練習していたら、JAVA5.0のプログラムでした。 下記のプログラムを1.4のバージョンに変更するにはどうしたらいいのでしょうか?? ---プログラム--- import java.util.ArrayList; public class ItemCollection { //商品一覧を保持するArrayList protected ArrayList<Item> list; //商品一覧に対するGETTER,SETTER public ArrayList getList(){ return this.list; } public void setList(ArrayList<Item> list){ this.list = list; } //引数のないコンストラクタ public ItemCollection(){ } //商品一覧に商品を追加 public void addItem(Item item){ list.add(item); } //商品一覧に商品を参照 public Item getItem(int index){ return list.get(index); } //商品一覧の数を返す public int getSize(){ return list.size(); } }

    • ベストアンサー
    • Java
  • ArrayListからHashMapの変換

    質問1) ArrayListからHashMapの変換(処理要件は満たすが、より良い方法がないか) 質問2) より良い設計はどうするべきか ※ 長文です。すいません。 == 前提条件:  工程) 保守フェーズ  環境) 3階層のWebシステム(クライアント/AP/DB)、AP実行環境はJava(1.4)、DBはOracle(10g) 処理の目的:  DBに存在するレコードの一覧を画面に表示する。  ただし存在しないレコードはnull(空)表示する。 以下テーブルが存在します。 ----------テーブルイメージ---------------- 内部キー(ID)  表示順序   画面表示名 (以降のカラム省略) ---------------------------------------- 1         1        AAAAAA 2         3        CCCCCC 3         5        DDDDDDD ---------------------------------------- 画面表示は以下です。表示枠は5つ。その他の項目も存在する。 ------------画面表示イメージ-------------- 1: AAAAAA 2: (空) 3: CCCCCC 4: (空) 5: DDDDDDD ----------------------------------------- 現状: DB参照は内製のORマッパを使用します。その内のひとつ、メソッドAは 上記テーブルを対象に3つのDTO(Data Transfer Object)を保持したArrayListを返却します。(orderは内部キー) 一方、画面表示ではkey=Valueでの取扱いが有利なため、HashMapで組んでいます。 このため、新たに構築したHashMapにArrayListの内容を順次展開しながら、Mapに 詰めなおすロジックが必要となっています。 (擬似コード)------ List list = ORマッパ.メソッドA(); Map map = new HashMap(); int order = 0; int listIndex = 0; DTO dto = null; for (int i = 0; i < DISPLAY_MAX_COUNT; i++) {   dto = (DTO)list.get(listIndex);   order = dto.get表示順序();   if (i == order) {     map.put((String)i, dto);      listIndex++;    } else {     map.put((String)i, null);   } } (擬似コード)------ 以上を踏まえ、質問いたします。 質問1) ロジックに対するInput/Outputを変更しない前提で、 ArrayListからHashMapの変換でよりよい方法はないか。 質問2) 仮に設計や製造を一からやりなおすことができるとしたら、 より良い設計はどうするべきか。 長文申し訳ないです。最後まで目を通していただきありがとうございます。

  • ArrayListを利用する問題

    問題 1.ArrayListのオブジェクトを生成する。 2.「何回入力しますか?」と出力し、標準入力をおこなう。 3.2で入力した回数分、以下の処理を繰り返す。 「n個目の値を入力してください」と出力し、標準入力を行う。(n=ループ回数) 入力された値をArrayListへ格納する。 4.ArrayListのサイズ分、以下の処理を繰り返す。 ArrayListより値を取得する。 取得した値を出力する。 結果 何回入力しますか? 3 1個目の値を入力してください。 hoge 2個目の値を入力してください。 poyo 3個目の値を入力してください。 hoo hoge poyo hoo 自分で書いたプログラム 1 import java.util.ArrayList; 2 import java.io.*; 3 4 class ArrayList2{ 5 public static void main(String[] args) throws IOException{ 6 7 ArrayList list = new ArrayList(); 8 list.add(n); 9 10 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 11 12 System.out.println("何回入力しますか?"); 13 14 String str = br.readLine(); 15 16 int num = Integer.parseInt(str); 17 18 for(int i = n ; i < num; i++){ 19 System.out.println("n個目の値を入力してください。"); 20 21 String str1 = br.readLine(); 22 23 } 24 } 25 } どうもうまくいきませんので教えて下さい。

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

  • 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
  • マルチスレッドと変数

    マルチスレッドのプログラムを組んでいます。 そこで、複数のスレッドからアクセスする変数があるのですが、これの扱いについて解らないことがあります。 ・変数を複数のスレッドから書き換える場合は、予想していた結果と違うことになる。 ここまではいいのですが、 ・変数を複数のスレッドから、参照だけするのは問題ない。 ・変数を複数のスレッドから、参照し、書き換えるのはひとつのスレッドだけならば、問題はない。 (上の"変数"は全て、Lockをかけていない状態です。) という認識をもっているのですが、これは間違いなのでしょうか? 「参照だけならばLockはかけなくてよい」というのをどこかで読んだような覚えがあり、そのまま勝手に最後の推測をしています。 現状ではうまくいっているようなのですが、とても不安です。 もしくは、状況、環境、コーディングによって上の仮定は成立したり、成立しなかったりするのでしょうか?環境はC#ですが、もしどのような言語、環境であっても一般的に、同じような結果になるのなら、それも合わせてご教授お願いします。

  • 参照カウントについて

    参照カウントについて聞きたいのですが、ウィキペディアで単純な実装では大量のオブジェクトが一斉に解放されることがあり、CPUの空き時間を利用してガベージコレクションを行う方法と比べると メモリの解放で処理が遅くなってしまう場合もある。 というのはマルチスレッドでいっきに開放するとマルチスレッドでメモリの空き時間を利用して開放を比べているのでしょうか?また一斉に開放とはスレッドを占有するということですか?