3

配列リストをクリアする必要がありますが、どちらがより良いアプローチですか?なぜですか?

アプローチ1:

List list = new ArrayList();
list.add("ram");

if(list!=null)
{
  list.clear();
}

アプローチ2:

List list = new ArrayList();
list.add("ram");

if(list!=null && !list.isEmpty())
{
  list.clear();
}   

アプローチ1では、リストが空かどうかをチェックしません。直接、リストをクリアしました。

しかし、アプローチ2では、リストが空でない場合は、チェックしてリストをクリアしました。

if(list!=null && !list.isEmpty())

どちらがより良いアプローチですか?アプローチ1またはアプローチ2?

4

7 に答える 7

7

第一に、ジェネリックを使用してみてください。

List<String> list = new ArrayList<String>();
list.add("ram");

現在初期化されているため、nullチェックは必要ありません。

これで、守る必要のある特定の契約がある場合、リストが空でないかどうかを確認できますが、@ Puceが言ったように、それはマイクロ最適化です。

list.clear();
于 2012-07-19T08:06:03.097 に答える
4

たとえば、ArrayListの場合、実装によって異なります(これはそのclearメソッドのコードです)。

     public void clear() {
         modCount++;

         // Let gc do its work
         for (int i = 0; i < size; i++)
             elementData[i] = null;

         size = 0;
     }

リストがすでに空の場合、コードがそれ以上の時間を費やさないことを意味します。この意味で、最初のアプローチで行ったように、コードをクリアします。

于 2012-07-19T08:07:05.437 に答える
2

そのソースコードはclear()、コレクションが空かどうかをチェックしません。

public void clear() {
    modCount++;

    // Let gc do its work
    for (int i = 0; i < size; i++)
        elementData[i] = null;

    size = 0;
}

ただし、これはごくわずかな最適化です。パフォーマンスに問題がある場合にのみ、これに対処する必要があると思います。

両方のバージョンを使用できます。とにかく、リストが空でない場合はクリアしたいと思います。リストが空の場合は、clear()メソッドの実行が非常に高速になるため、気にしないでください。

于 2012-07-19T08:07:55.743 に答える
2

それは問題ではありません。clear()vsのチェックのオーバーヘッドはisEmpty()、1行のコードです。modcount++;

于 2012-07-19T08:07:59.340 に答える
1

実装方法によって異なりますclear()。これはせいぜいマイクロ最適化なので、これについて考えるのにあまり時間をかけないことをお勧めします。

于 2012-07-19T08:04:20.587 に答える
1

は配列ベースなのでArrayList、空かどうかを確認する必要はありません。したがって、私はその「マイクロ」高性能のために最初のアプローチが好きです

于 2012-07-19T08:07:03.730 に答える
0

リストを再度初期化します。

List list = new ArrayList();
 list.add("ram");

 if(list!=null && !list.isEmpty())
 {
   list = new ArrayList();
 }   
于 2012-07-19T08:04:53.663 に答える