2

ディレクトリ名を取得する次のメソッドがあります。

    private List<String> getListOfDirectories(String rootDirectoryPath) {

        List<String> listOfDirectories = new ArrayList<>();

        File directory = new File(rootDirectoryPath);
        File[] listOfFiles = directory.listFiles();

        for (int i = 0; i < listOfFiles.length; i++) {

            if (listOfFiles[i].isDirectory()) {
                listOfDirectories.add(listOfFiles[i].getName());
            }
        }

        return listOfDirectories;
    }

これらのディレクトリ名をリストに一時的に保存しています(保存が適切な用語かどうかはわかりません)。50000 のディレクトリ名がある場合、リストは正しい選択ですか? メモリ効率がよく、50000 以上の文字列を処理できますか?

編集:ローカル ディレクトリで html ファイルを検索し、それらの html ファイルを解析するアプリを開発しています。

4

4 に答える 4

5

Listは単なるインターフェースなので、実際にはリストの実装に依存します。を仮定するとArrayList<String>、それはおおよそ。と同じくらいメモリ効率が良いでしょうString[]。配列リストの最悪のケースは、基になる配列が実際に格納されているデータの量よりも一定の係数(通常は2)大きいことです。

後でリストをどのように使用するかに応じて、メモリ効率が必要な場合は、トライブルームフィルターなどを使用できます。

于 2012-11-14T04:04:18.533 に答える
4

は、メモリ使用量ArrayList<String>がほとんどありません。String[]約50,000個の文字列を格納することがわかっている場合はArrayList、その初期容量でを構築すると役立ちます。再割り当てが大幅に削減されます。しかし、私は絶対に使用しませんLinkedList。これにはかなり多くのオーバーヘッドがあります。

文字列自体がメモリに収まれば、50,000エントリを保存するのに問題はありません。

于 2012-11-14T04:04:15.727 に答える
2

リストはそれを処理できます、それは利用可能なメモリの量があるかどうかにのみ依存します。

50000個の要素があることが本当にわかっている場合は、次のようにリストを宣言するとよいでしょう。

List<String> list = new ArrayList<String>(50000); //specify the initial capacity

これにより、リストのサイズ変更のオーバーヘッドがなくなります。

于 2012-11-14T04:05:01.363 に答える
1

あなたが指摘したように; ローカル ディレクトリで html ファイルを効率的に検索する方法を探しています。

したがって、htmlファイルの数は変化し続けるため、すべての詳細をArrayListのメモリに保存する意味はないと思います。これらすべてのファイルを検索するプロセスを実行し、html ファイル名を別の物理ファイル (txt ファイルなど) に保存することをお勧めします。このようにして、ジョブを実行することで定期的にファイルのリストを更新し続けることができます (UNIX スクリプトを使用することも、 java を介して行うこともできます)。

そして、それらの html ファイルに対して実際に何らかの操作を実行する必要がある場合。txt ファイルから html ファイル名を読み取ります。

txt ファイルから読み取った後、ArrayList を使用できます。ただし、すべての名前をメモリに保持することはお勧めしません。

于 2012-11-14T05:05:43.433 に答える