- PR -

これは何と言うわざでしょうか

投稿者投稿内容
isseki
大ベテラン
会議室デビュー日: 2001/11/05
投稿数: 107
投稿日時: 2003-04-30 03:26
お久しぶりです。
皆さん元気でいらしゃっていますね。
さて
Q1.Interface RandomAccessが何のために使われるのでしょうか(例えば)。
Q2.Interface RandomAccessにはメソッド一つも宣言していないとはどういうわけでしょうか。

宜しくお願いします。
H2
ぬし
会議室デビュー日: 2001/09/06
投稿数: 586
お住まい・勤務地: 港
投稿日時: 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というインターフェイスはただ単に、ランダムアクセスをサポートしていますよと教えるためです。

たとえばですが、以下のようなコードを書くことによって、ある程度プログラムの効率化を図ることができます。(そんな面倒なことはめったにしませんが・・・)
コード:

List list;
//... list の初期化

if(list instanceof RandomAccess) {
/*listがVectorかArrayListの場合、こっちが早い*/
for (int i=0, n=list.size(); i < n; i++)
list.get(i);
} else {
/*listがLinkedListの場合、こっちが良い*/
for (Iterator i=list.iterator(); i.hasNext(); )
i.next();
}



[ メッセージ編集済み 編集者: H2 編集日時 2003-04-30 07:32 ]
isseki
大ベテラン
会議室デビュー日: 2001/11/05
投稿数: 107
投稿日時: 2003-04-30 11:09
H2さん
お久しぶりです。
丁寧なご返答本当にありがとうございます。
よく分かりました。

ここでの「ランダム」というのはこんなことですか。
勉強になりました。
それにいま使おうとしているLinkedListに関して見直そうとしています。
(実例コードはとても啓発的で、参考させていただきます)

改めて御礼を申し上げたいです。
またよろしくお願いいたします。


[ メッセージ編集済み 編集者: isseki 編集日時 2003-04-30 11:11 ]
isseki
大ベテラン
会議室デビュー日: 2001/11/05
投稿数: 107
投稿日時: 2003-04-30 11:22
入力ミスだと思いますが、念のために確認させていただきますm(__)m

H2さんが書かれました↓
”ランダムアクセスをサポートしているコンテナ(Vector, LinkedList,.....”
”ところがLinkedListの場合、その構造上、ランダムアクセスができません。”

最初の行の中の"LinkedList"は他のコンテナのことでしょうね。

宜しくお願いいたします

[ メッセージ編集済み 編集者: isseki 編集日時 2003-04-30 11:24 ]
isseki
大ベテラン
会議室デビュー日: 2001/11/05
投稿数: 107
投稿日時: 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さんが指摘されたような「ランダム」的なアクセスも可能ですね。

ご指導お願い致します

amnaky
ベテラン
会議室デビュー日: 2002/09/13
投稿数: 75
お住まい・勤務地: 東京
投稿日時: 2003-04-30 16:42
ArrayListは、データを配列で持っているので、
elementData[5]などとして、まさに直接要素を指定することに
より、文字通り「ランダムアクセス」できます。

LinkedListは、配列ではなく、双方向リストでデータを持っています。
双方向リストが何かは検索すればわかると思います。

get(5)などとした場合、LinkedListの場合、双方向リストの
先頭もしくは最後尾から、一つずつたどっていきます。
つまり内部的にはシーケンシャルなアクセスをしているわけです。

ですので、配列なら一発で探せるのに、LinkedListだと
時間がかかると。
tabby
ベテラン
会議室デビュー日: 2002/06/26
投稿数: 55
お住まい・勤務地: 埼玉県・東京都
投稿日時: 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
H2
ぬし
会議室デビュー日: 2001/09/06
投稿数: 586
お住まい・勤務地: 港
投稿日時: 2003-04-30 21:35
#そういえば久しぶりですね。

引用:

issekiさんの書き込み (2003-04-30 14:46) より:
H2さんが指摘されたような「ランダム」的なアクセスも可能ですね。


他のみなさんが指摘されていますように、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

引用:

2003-04-30 07:31の書き込みより
APIドキュメントにも書かれているように、ランダムアクセスをサポートしているコンテナ(Vector, LinkedList, HashTableなどなど)をマークするためです。


括弧書きの中はコンテナ一般です。Vector, LinkedList, HashTableなどなどがコンテナですよということです。ごめんなさい、誤解を生んでしまいました・・・。なお、この3つの中でランダムアクセスをサポートしているのはVectorだけです。

スキルアップ/キャリアアップ(JOB@IT)