0

私はJavaの(しかし学習中の)データ構造の経験がなく、どのタイプのリストを選択すればよいかわかりませんでした。私の問題は、データを取得してリストと照合するソケット サービスを作成していることです。存在しない場合は、処理するデータを渡し、データ ID 番号をリストに追加して、同じデータが取得されないようにします。再度処理されます (データを処理しているサービスは、重複した作業があるかどうかを知らないため、これはフィルターとして機能しています)。

arraylist は高速であると読みましたが、以前にリストのサイズを知る必要があることに気付きました。昔ながらの integer[] を使用するだけだと思っていましたが、もっと良い方法があるかどうか尋ねてみようと思いました。

私のプロセスに関連する詳細はほとんどありません。私のデータ自体は複雑ですが、ルックアップのためにデータをハッシュコードに変換し、それに対してチェックしているため、すべてのデータは整数(正/負)であり、クライアント要求のサービスはランナブルを介して行われるので、データをより効率的にするために何かできることがあれば、それを行うことができます(ループアップを高速化するために、すべての整数が頻繁にソートされるのではないかと考えていました)。integer[] で十分ですか、それとももっと良いものがありますか?

4

4 に答える 4

2
it will surely hit several billion items

私はそれを非常に疑っています。それはギガバイトのデータになります。

本当に数十億のアイテムがある場合は、メモリではなくデータベースに永続化することをお勧めします。一部のクエリを高速化するためにサブセットをメモリにキャッシュすることは確かに許可されていますが、長期的な解決策は、サーバーがダウンしても値を保持するデータベースです。

ID が存在するかどうかを確認するためのデータベース クエリは、数ミリ秒しかかかりません。それらをメモリ内に保存するよりも、長期的な解決策として優れていると思います。

于 2012-04-16T01:35:36.813 に答える
1

ID が数値または文字列の場合、 を使用できますHashSet<IDType>。ここIDTypeで、 は ID のタイプです (例: int)。これにより、最適な検索時間が確保され、すべての要素が一度だけ保存されます。

ArrayList も機能しますが、それを検索するには、すべての要素を比較して、リスト全体を走査する必要があります (最悪の場合、可能性として)。

于 2012-04-16T01:35:41.640 に答える
1

まあ、貴重なアイテムをチェックしようとしている場合は、いずれの方法でもすべてのアイテムを保管する必要があります. の使用をお勧めしますHaspMap。また、hashmaps1 つでは不十分な場合は、複数使用することもできます。

することで簡単に確認できます

if(map.containsKey(blah))
    //Do something

hashmap何かに基づいてアイテムを区別できると思われる場合は、複数を使用してください。その方が早いかもしれません。また、アイテムがこれほど大きいため、キャッシングを行うためLinkedHashMapに と を一緒に使用することをお勧めします。これにより、頻繁に発生するアイテムが優先度 Q に格納HashMapされるため、プロセスが高速化されます。LinkedHashMap

于 2012-04-16T01:37:32.887 に答える
1

すでにデータをハッシュしている場合は、リストではなく HashSet や HashMap などのハッシュされたコレクションのいずれかを使用してみませんか?

于 2012-04-16T01:37:43.107 に答える