- PR -

Map系でEntryをValueの値でソートするには?

投稿者投稿内容
想馬
大ベテラン
会議室デビュー日: 2003/05/29
投稿数: 245
お住まい・勤務地: 神奈川・東京
投稿日時: 2005-04-28 17:35
リンク先の記事を読んでみました。この記事は Java World に掲載されていた気がするなぁ・・・


んーと、A.K.渡邉さんが言われている部分は「オブジェクトコレクションの受渡し」の「アクセス方法」のアクセス性能っていう所の数値ですよね?
各メソッドの引数に List インターフェースが指定されていますけど、このメソッドを使って測定したときに引数に指定したクラスが Vector なのか ArrayList なのか LinkedList なのか書いてないですね。

Vector はコレクション・フレームワークが登場する前からあったクラスですが、これは同期化されているため ArrayList に比べれば遅いです。

ArrayList はランダムアクセス(インデックスを指定する)に特化しているクラスですが同期化はされていません(同期化されてない Vector みたいなクラス)。
なのでマルチスレッドのアプリケーションではないなら Vector ではなく ArrayList を使った方が効果的です。
欠点は ArrayList が内部で配列としてデータを持っているため、一定数を超えると内部で再構成が行われてしまいます。またリストの間にデータを追加しても配列の再構成が起きてしまいます。

LinkedList は順次アクセスに特化したクラスでこれも同期化されていません。データは内部でリスト構造で持っているので要素の追加は参照の付け替えだけなのでデータが増えようがコストは一定です。
ただしリスト構造なので内部で配列として持っている ArrayList とは違い、getメソッドのようにインデックスで指定すると先頭から探してしまうためかなり遅いです。

本題ですが、Iterator の nextメソッドの実装は ArrayList と LinkedList で当然違います。
ArrayList は内部でカウントを持っていて、Iterator を取り出したときに 0 から始まり getメソッドで要素を取り出し、カウントアップします。
LinkedList は要素を一時的に退避して要素の次の要素の参照を自分に代入し、退避していたオブジェクトを返すだけです。
ArrayList の getメソッドの処理にかかるコストと比べて要素の参照のみを見る LinkedList の方が圧倒的に速いです。

ただ余程大量のデータではない限りは ArrayList で十分だと思いますけど・・・
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2005-04-28 17:50
思ったことを。

1..アプリケーション全体に取ってインパクトの少ない部分のチューニングは労
 力の無駄ですよ。
2.HotSpotコンパイラが動いている現在のJVMでは、マイクロベンチマークの結果
 は信用できないことが多いです。
3.抽象化は、性能とのトレードオフがあって当然です。メリットとデメリットを
 考えて使い分けたほうが良いかと思います。
 例えば、本当にその程度の性能差がもたらすデメリットが重要であるならば、
 そもそもコアAPIのコレクションフレームワークなんぞは使わない選択になると
 思いますし、あるいはJava以外の言語を使用することになるかもしれません。
4.JVMの進化により、5年前の測定結果は全く意味が無いものになっています。
 まずは今現在の状況を自分で調べるべきかと思います。

この辺を参考に。
http://www.javaperformancetuning.com/

日本語版のサマライズがここに。
http://www.javanews.jp/javap/

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