2012-02-18 10 views
23
List<String> listStr = new ArrayList<String>(); 

if(listStr.size == 0){ 

} 

私の見解でlistStr.isEmpty()を使用する利点の一つは、それがないということですリストのサイズをチェックし、それをゼロと比較します。リストが空であるかどうかをチェックします。コードベースでif(listStr.isEmpty())の代わりにif(listStr.size == 0)と表示されることが多いため、他にも利点はありますか?私が気づいていないことがこのようにチェックされている理由はありますか?場合(listStr.size == 0){対IF(listStr.isEmpty()){

+3

1.6では、 'ArrayList.isEmpty'は' return return size == 0; 'として実装されています。 – khachik

答えて

26

this questionへの回答はあなたに答えを与えることができます。基本的に、いくつかのリストの実装では、メソッドisEmpty()は、サイズがゼロである(したがって、パフォーマンスの観点からはそれらが事実上同等である)かどうかをチェックします。ただし、他のタイプのリスト(リンクされたリストなど)では、アイテムが空であるかどうかをチェックするよりも、アイテムのカウントに時間がかかります。

このため、リストが空であるかどうかを確認するには、isEmpty()メソッドを使用すると常に便利です。 ArrayList,VectorおよびLinkedListは同じListインターフェイスを実装しているので、そのような方法がすべてのタイプのリストで提供される理由は、インターフェイスに関連します。isEmpty()メソッドを持ちます。次に、それぞれの特定のタイプのリストは、isEmpty()メソッドの実装を提供します。

+2

いいえ、ちょうど1つのコメント:LinkedListのsize()の実装はリストをトラバースするのではなく、新しい要素が追加または削除されるときにサイズを追跡します。したがって、LinkedListsのsize()とisEmpty()のパフォーマンス(AbstractCollectionから継承したもの)はまったく異なるわけではありません。それは、isEmpty()よりサイズの実装が遅いデータ構造があるかもしれないことに同意しますが、妥当な実装ではありません。また、DRYの原則については、ifほとんどのisEmpty()メソッドでsize()== 0が既に実行されています。 –

11

いいえ、理由はありません。 isEmpty()はその意図をより明確に表しており、好ましいものでなければなりません。 PMDにもa ruleがあります。しかし、大したことではありません。

+0

正確に。また、javadocでそれを調べてください。とにかくisEmpty()からsize()を呼び出す実装もあります。 – YRH

6

.size()は、データ構造に応じてO(1)またはO(N)にすることができます。 .isEmpty()は決してO(N)ではありません。

+1

isEmptyが常にO(1)になる理由はわかりませんが、isEmpty()は常に少なくともsize()と同じくらい速いはずです。それはデータ構造にも非常に依存する可能性があります。私は、サイズがO(n)である標準コレクションを認識していません。 1つはありますか? –

+1

想像してみてください。センチネルを持つ構造体 - Cの文字列、NULLで終了するポインタの配列、nilで終わるセルのリストこれらはすべて、長さをキャッシュするハイブリッドタイプの下にある可能性がありますが、それは無料ではありません。 ConcurrentLinkedQueue –

関連する問題