- - PR -
これは何と言うわざでしょうか
| 投稿者 | 投稿内容 | ||||||||
|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2003-04-30 03:26
お久しぶりです。
皆さん元気でいらしゃっていますね。 さて Q1.Interface RandomAccessが何のために使われるのでしょうか(例えば)。 Q2.Interface RandomAccessにはメソッド一つも宣言していないとはどういうわけでしょうか。 宜しくお願いします。 | ||||||||
|
投稿日時: 2003-04-30 07:31
APIドキュメントにも書かれているように、ランダムアクセスをサポートしているコンテナ(Vector, LinkedList, HashTableなどなど)をマークするためです。
VectorやArrayListは内部で配列を使っているため、取り出すのはいつでもすぐです。これをランダムアクセスといいます。 Vector v = new Vector(); //...vに要素をいれる... Object o = v.get(4); //<- すぐに4番目の要素が取れる。 ところがLinkedListの場合、その構造上、ランダムアクセスができません。Vectorのように4番目の要素を取り出そうとした場合、まず一つ目を取り出し、それから二つ目を取り出し、三つ目を取り出してからやっと4番目の要素が取り出せます。つまり、サイズが大きくなればなるほど、LinkedListから要素を取り出すのに時間がかかってしまいます。これはシークエンシャルアクセスといいます。 (似たものでは、メモリはランダムアクセス、テープ機器はシークエンシャルアクセスです) RandomAccessというインターフェイスはただ単に、ランダムアクセスをサポートしていますよと教えるためです。 たとえばですが、以下のようなコードを書くことによって、ある程度プログラムの効率化を図ることができます。(そんな面倒なことはめったにしませんが・・・)
[ メッセージ編集済み 編集者: H2 編集日時 2003-04-30 07:32 ] | ||||||||
|
投稿日時: 2003-04-30 11:09
H2さん
お久しぶりです。 丁寧なご返答本当にありがとうございます。 よく分かりました。 ここでの「ランダム」というのはこんなことですか。 勉強になりました。 それにいま使おうとしているLinkedListに関して見直そうとしています。 (実例コードはとても啓発的で、参考させていただきます) 改めて御礼を申し上げたいです。 またよろしくお願いいたします。 [ メッセージ編集済み 編集者: isseki 編集日時 2003-04-30 11:11 ] | ||||||||
|
投稿日時: 2003-04-30 11:22
入力ミスだと思いますが、念のために確認させていただきますm(__)m
H2さんが書かれました↓ ”ランダムアクセスをサポートしているコンテナ(Vector, LinkedList,.....” ”ところがLinkedListの場合、その構造上、ランダムアクセスができません。” 最初の行の中の"LinkedList"は他のコンテナのことでしょうね。 宜しくお願いいたします [ メッセージ編集済み 編集者: isseki 編集日時 2003-04-30 11:24 ] | ||||||||
|
投稿日時: 2003-04-30 14:46
不思議
LinkedListとはいったいどんなものでしょうか。 Class LinkedList java.lang.Object java.util.AbstractCollection java.util.AbstractList java.util.AbstractSequentialList java.util.LinkedList 確かに「LinkedList」は「SequentialList」を継承して作られたclassですね。 でもget(int index) をも持っていますから、、、 H2さんが指摘されたような「ランダム」的なアクセスも可能ですね。 ご指導お願い致します | ||||||||
|
投稿日時: 2003-04-30 16:42
ArrayListは、データを配列で持っているので、
elementData[5]などとして、まさに直接要素を指定することに より、文字通り「ランダムアクセス」できます。 LinkedListは、配列ではなく、双方向リストでデータを持っています。 双方向リストが何かは検索すればわかると思います。 get(5)などとした場合、LinkedListの場合、双方向リストの 先頭もしくは最後尾から、一つずつたどっていきます。 つまり内部的にはシーケンシャルなアクセスをしているわけです。 ですので、配列なら一発で探せるのに、LinkedListだと 時間がかかると。 | ||||||||
|
投稿日時: 2003-04-30 17:01
java.util.Listのインターフェイスを実装したクラスであれば
get(n)によるランダムアクセスをすることが出来ます。 具体的には以下の3つのクラスがそれにあたります。 ArrayList, LinkedList, Vector このうち、RandomAccessを実装しているものは ArrayList, Vector の2つだけです。 RandomAccessのインターフェイスは単なるマーク付けとして使用され get(n)の実行速度が保持しているオブジェクトの数にかかわらず 一定であることを意味しています。 <APIドキュメントから引用> マーカーインタフェースは、高速な (一般的には一定時間) ランダムアクセスをサポートすることを示す、 List 実装により使用されます。 http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/util/RandomAccess.html | ||||||||
|
投稿日時: 2003-04-30 21:35
#そういえば久しぶりですね。
他のみなさんが指摘されていますように、LinkedListのgetメソッドは擬似ランダムアクセスです。内部では密かにシークエンシャルなアクセスをしています。 こういうデータ構造に関する知識はプログラミングをやるには知っておくべきです。とても便利ですから。教科書でお勧めなのは、「Javaで学ぶアルゴリズムとデータ構造」(Robert Lafore著 岩谷宏訳)です。 本当なら、"The Art of Computer Programming" Donald Knuth なんですけどね http://www.amazon.co.jp/exec/obidos/ASIN/0201485419/ref%3Dase%5Fseshopcom-22/249-1726650-4393956
括弧書きの中はコンテナ一般です。Vector, LinkedList, HashTableなどなどがコンテナですよということです。ごめんなさい、誤解を生んでしまいました・・・。なお、この3つの中でランダムアクセスをサポートしているのはVectorだけです。 | ||||||||
