• ベストアンサー

String[] とVectorの使い分け

 失礼いたします。 きっとこの質問は大勢の方が持っているのではないかと思い質問します。 自分はDBを利用した業務系のwebアプリ開発を行っているのですが、 DB情報の取得の際、その情報を何に格納するかで疑問が生じました。 例えば会社情報を検索したとして、各会社の情報はそれぞれ1つのインスタンスに持たせます。 これは会社数だけ繰り返されます。 そこで、そのインスタンスを順次何に入れるかなのですが、 型を持ったインスタンスの配列にするケースとVectorに入れるケースと両方見たことがあります。 きっと他にも方法は多種あるでしょう。 ではここで、配列(この場合インスタンスの配列)とVector、ArrayやListの使い方、またMapとCollectionなどの違いはどのように 利用するのが好都合なのでしょうか?Arrayの場合ポインタ式であることが絡んでくるでしょうか。 それとも昔から業務に固有の風習があり、この業務では習慣的にArrayとListが使われるが、 別の業務だとString[]とArrayが使われる、などのように 歴史的な理由で統一できていないのでしょうか? 全てではなくても、何らかの使われ方の違いや効率のよい 使い方の優先順位などがあれば教えてほしく思います。m(__)m

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

  • ベストアンサー
  • PED02744
  • ベストアンサー率40% (157/390)
回答No.2

私は通常は配列かなあ~ 個数があらかじめわかっていないとき位しか、ArrayListは使いません。 ジェネリック(<T>)がJava5.0から実装されたので、ArrayListでも混乱することはなくなったと思いますが、 それまでは、何でも一緒に入れられたので、混乱を避けるために、 できるだけObject型に変換されてしまうクラス・メソッドは使わない ようにする必要があったのです(instanceofのチェックだらけになってしまう(笑)) これゆえ、crumさんに言わせるところの初期の頃しか知らない人ということに(笑) Vectorは使いません。推奨されていません。 基本的に古いJDKとの互換性にのみ残されているということのようです。 (とかいってるくせに、JDKのソースの中はVectorがたくさん出てくる(笑)) Vectorの代わりにArrayListを使います。 大きな違いは、「マルチスレッド保護の有無」と「自動拡張サイズ」でしょうか。 MapとCollectionは情報取得にキーが必要かどうかで決めればよいと思います。

japan_3
質問者

お礼

>Vectorは使いません。推奨されていません。  ばっさりとした回答、ありがとうございました。  一角が消えただけでかなり検討がしやすくなりました。(^▽^)  それにしても・・うちの先輩はVector使ってたんですけどね~(謎 >MapとCollectionは情報取得にキーが必要かどうかで決めればよいと思います。  なるほど、ありがとうございます。  また、重複を許すかどうかなどでは別の手法も必要ですね。 >マルチスレッド保護の有無  う~ん、そんな違いもあるのですね。  シングルトンパターンを使っているので今回は大丈夫だと思いますが・・。  質問者側の立場で答えて頂き、短い文章の中でも学ぶものは多かったです。ありがとうございました。m(__)m

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

その他の回答 (2)

  • yokkou
  • ベストアンサー率30% (34/111)
回答No.3

個数が分かっているなら配列(String[])を使用します 適当に作るものならArrayでも十分ですが、仕事の上ではパフォーマンスを考慮して、コストの少ない方向で判断しています 大規模になればなるほど、「塵積も」ですので

japan_3
質問者

お礼

ご回答ありがとうございました。 なるほど、確かに私の携わった中で、総勢200名、3年規模の プロジェクトでは 型名[] 配列を使っていました。 多角的な視野で考えられるアドバイスになりました。 ありがとうございます。

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

私は配列はほとんど使いません。配列っぽいものを使いたいときはArrayListを使います。 Java5からは総称型のおかげで、ますます配列は使わなくなりました。周りを見ても配列を使っていることはほとんどないと思います。 多くの業務プログラムで配列にすべきかArrayListにすべきかを問題視するほど速度やメモリ使用量などを気にすることはないと思うので、使いやすいArrayListなどを使ったほうがいいと思います。 もちろん問題視される場合もあるので、そのときは改めて調査して、どちらにすべきか考えればよいだけです。 また、もし速度などが問題になったとき、Listインタフェースを実装しているほかのコレクションクラスにすることも容易です。 業務固有という話はあまり聞きません。こんな言語レベルの話が業務に影響するとも思えません。 そのプロジェクトの歴史的な理由はあると思います。とくにJavaの初期の頃しか知らない人が携わっていたとか、そもそもJavaを知らない人がメインのプログラマだったとか・・・。 すいません、Collection Framworkの内容については調べてください。

japan_3
質問者

お礼

>Javaの初期の頃しか知らない人が携わっていたとか、そもそもJavaを知らない人がメインのプログラマだったとか・・・。  ありえます!  継承なんかも親、子、孫、ひ孫まで使っているプロジェクトを見たことがあります。もう、どこに何が入っているのか・・ せめて3段階くらいにして欲しい・・ >Java5からは総称型のおかげで、ますます配列は使わなくなりました  そうなんですね。  ではこれからはArrayList<型>が主流になるのでしょうか。  ただ、対応していないシステムが数年、数十年は残り続けるのでしょうね。  しかも未だにjava1.3.1を使っているので・・(化石  しっかり本番のバージョンは確認しないとな~と、一介のPG/SEとして思います。 ご回答ありがとうございました。

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

関連するQ&A

  • (STL) vectorとlistの違い

    vectorとlistの違いって何なんでしょうか。 vectorは動的な配列の確保で listも動的な配列だけど双方向探索やソートもできる、 つまりlistはvectorの機能を含む拡張版みたいなもの、こう考えてよろしいのでしょうか? いまいちvectorとlistが同じようなものに見えて仕方ないのです・・。

  • c# 要素と値

     こんにちは、c#初心者です。  細かいことなんですが、気にしだしたら止まらなくなって、遂に質問です。  配列などで、そのインデックスの位置に含まれているオブジェクトは”値”と呼ばれているところを見かけるのですが、List<T>などのコレクションでは”要素”と呼ばれているのを見かけます。  例えば、Array.IndexOfメソッドでは、XMLに「値を検索します」と書かれている上に、「T value」と値であることが明記してあります。  一方、List<T>のIndexOfメソッドでは、”要素”と書かれていて、「T item」となっています。  「配列の中身は値(value)、コレクションの中身は要素(item)と区別しているのか」と納得しかけていた矢先、Array.Exists 「指定された配列に、……”要素”が……」と配列でも要素という単語が使用されているじゃないですか!  もう訳が分かりません。確かに、値と要素なら大して意味の違いはないので読み手には問題ないですが、書き手にとってはどう使い分ければよいのかちんぷんかんぷんです。  どなたか使い分けの分かる人がいらっしゃいましたら教えていただけませんか?

  • オブジェクトを配列として扱いたい

    Java(オブジェクト指向)を始めて数日の者です。 LinkedListを利用し、インスタンス化したオブジェクトをListに入れて 扱えるようにしたいと考えています。 具体的には LinkedList<クラス名> array = new LinkedList<クラス名>(); クラス名 object1 = new クラス名(); -object1の処理- array.add(object1); -object1の処理- array.add(object1); -object1の処理- array.add(object1); このようにして、object1を配列で管理するイメージです。 object1の処理結果は、毎度変わっています。 しかしこれですと、最後のobject1の処理の内容がすべてのarray(i)に入ってしまいます。 要は、array(i)は全て、同じobject1を参照しているだけ。 object1の変更結果がarray(i)に入っていくというイメージでは無い、ということでしょうか? また、この他でインスタンス化したものを配列で管理できるような方法がございましたら、ご教授いただけると幸いです。m(_ _)m 動的に配列の要素数を変更(要素が追加)ができるようにしたいのです。

    • ベストアンサー
    • Java
  • C++言語の配列の呼び方,動的・可変長の違い

    C++言語での配列の名称についての質問です. int Array[10]; みたいに宣言する普通の配列は「静的配列」と呼びますよね.コンパイル時に定数で要素数を指定しておかなければならないからですよね. これに対して,new[]演算子を用いて int *Array = new int[n]; といったように確保する配列はなんと呼ばれるのでしょうか. 実行後に変数を用いてその要素数を動的に指定できるので,「動的配列」と呼ぶ人が周りには多いです(「ポインタ配列」とも).しかし,C言語でのrealloc関数みたいに,直接に配列長を変化させるといったようなことはできませんよね. (改めてnew[]してmemcpy()すれば出来るのでしょうが) そこで,配列長をプログラム中で自在に変化させる方法としてstd::vectorを利用する方法がありますよね.このvectorを「動的配列」と呼ぶ人もいました. 私は,new[]したものは動的に要素数を指定できるがその後の配列長は固定であり,vectorはいつでも配列長が可変なので int Array[10]; ・・・静的固定長配列(静的配列) int n = 10; int *Array = new[n]; ・・・動的固定長配列 std::vector<int> v; ・・・可変長配列 と呼んでいるのですが,一般的にはそれぞれどのように呼ばれるのでしょうか. また,最近はstd::arrayをいうものを知りました.これについてもどのように呼ばれるのか,教えてください. よろしくお願いいたします.

  • foreachで配列を作る

    $array = array("id","name","address","tel","point","a1"); $res = $db->query($sql);  //sqlのクエリー while ($row = $res->fetchRow( DB_FETCHMODE_ASSOC )) { $data_list[]=array( $array[0]=>$row["$array[0]"], $array[1]=>$row["$array[1]"], $array[2]=>$row["$array[2]"], $array[3]=>$row["$array[3]"], $array[4]=>$row["$array[4]"], $array[5]=>$row["$array[5]"]); } をforeachを使って $array = array("id","name","address","tel","point","a1"); $res = $db->query($sql);  //sqlのクエリー while ($row = $res->fetchRow( DB_FETCHMODE_ASSOC )) { foreach(~){             //処理     } のようにかきかえたいのですがどうしたらいいでしょうか?foreachをしらべていろろやったのですがうまくいきません。よろしくおねがいします。  ちなみに$data_list[]の配列はArray ( [0] => id [1] => name [2] => address [3] => tel [4] => point [5] => a1 ) Array ( [0] => Array ( [id] => 0 [name] => ここあ [address] => 東京 [tel] => 2 [point] => 2 [a1] => 2 ) [1] => Array ( [id] => 1 [name] => 太郎 [address] => 東京 [tel] => 3 [point] => 5 [a1] => あ ) [2] => Array ( [id] => 4 [name] => 五郎 [address] => 東京 [tel] => 0 [point] => 1 [a1] => あああああ ) [3] => Array ( [id] => 5 [name] => 士郎 [address] => 神奈川 [tel] => 26 [point] => 5 [a1] => ああああああああああ ) …となります。

    • 締切済み
    • PHP
  • C言語 一般的な引数の名称について

    C言語での引数の名称について質問です。 一般的に 引数の数は"argc"とか"ac" 引数自体は引数名へのポインタを格納する配列名として"argv"とか"av"にしますよね。 arg : argument c : count v : vector だと思うのですが、なぜ突然ベクタといった名称が使われるのでしょうか? ベクトル計算に配列を使うからという意味でしょうか? そういえばexecファミリでも同じように"v"が利用されていますね。 execv:execute vector 追加で質問なのですが execlというのもあります。 execl:execute list でしょうか?? ベクトル、リストといった名称がどこからきたのか直感的に分からず気持ち悪さを覚えています。 もしお分かりの方がいらっしゃいましたら教えてください。

  • array関数につきまして

    すみません。PHPの初心者でございます。 下記のコードの中に (array)$anq_list とありますが、 個人には、arrayの使い方は、array(---)のような感じだと思っていましたが、 下記のサンプルでは、(array)となっております。 これはどのような意味になるのでしょうか。 なお、(array)をつけたバージョンと、つけないバージョンでテストしたところ、 どちらもかわりませんでした。 個人的には、無くてもいいかと思いましたが、何か、別の意図はありますでしょうか。 <?php //libsフォルダにある共通関数を読み込む require_once("../../../../libs/function.php"); //初期化関数を呼び出す init(); //ログイン状態をチェックする関数を呼び出す loginCheck(); //データベースに接続する関数を呼び出す $db = db_connect(); //アンケートデータを取得する $sql = "SELECT * FROM anq_t ORDER BY create_datetime DESC"; $anq_list = $db->getAll($sql,DB_FETCHMODE_ASSOC); //好きな動物の「,」区切りのデータを配列データに変換する処理を行う foreach ($anq_list as $key => $value ) { $anq_list[$key]["animal"] = explode(",",$value["animal"]); } //Smartyを生成 $smarty = new MySmarty(); $smarty->assign("anq_list",$anq_list); $smarty->assign("sex_value",getSexList()); $smarty->assign("age_value",getAgeList()); $smarty->assign("animal_value",getAnimalList()); $smarty->display("admin/anq_result.tpl"); ?> 以上、お手数をお掛けしますが、よろしくお願い致します。

    • ベストアンサー
    • PHP
  • セル範囲から一次元配列の生成

    VBAで動的に一次元配列を作成しようと思っています。 Dim DataList01 DataList01 = Array("項目01", "項目02", "項目03") のような配列を DataList01 = Array(Range("A1:A3").Value) などという方法で作成することはできないでしょうか? 動的に作成したArrayを、ユーザー設定リストに登録し、 ソートを行おうと考えていますが DataList01 = Array(Range("A1:A3").Value) Application.AddCustomList Listarray:=DataList01 で行うと、登録時点でエラーが発生します。 (実行時エラー '13':型が一致しません。) 行や列の情報を除外した、RangeからValueの配列の抜き出し方を 知っている方はお願い致します。

  • Visual Studio 2003での2次元可変長配列でエラー

    Visual Studio 2003での2次元可変長配列でエラーが発生します。 エラー内容 'System.NullReferenceException' のハンドルされていない例外が microsoft.visualbasic.dll で発生しました。 追加情報 : オブジェクト参照がオブジェクト インスタンスに設定されていません。 ソースは dim return_array()() For i As Integer = 0 To 5 Step 1 ReDim Preserve return_array(i)(6) Next のような感じです。 ループを使う必要があるのはreturn_array()()が状況に応じてサイズを変更が必要なためです。

  • 配列に配列を足すことはできるか?

    PHPを使ってMYSQLのデータを吐き出すプログラムを作っています。 $re=mysql_query(SQL命令1); でDBに命令し $kekka=mysql_fetch_array($re) で、配列に代入 $re=mysql_query(SQL命令2); でDBの別テーブル(データ型やカラム数は同じ)に命令し $kekkaに情報を足すということがしたいのですが、どのように書けば$kekkaにデータが蓄積されていくのでしょうか?

    • ベストアンサー
    • PHP