2017-03-02 9 views
1

リンクリストindexof()がnullの "target"が渡されたときのパフォーマンス向上のために "header"エントリにnull要素があるという事実を利用しない理由を知りたい":LinkedListのindexOf()vs lastIndexOf()メソッドの最適化

public int indexOf(Object o) { 
    int index = 0; 
    if (o==null) { 
     // header.element guaranteed null, no chance of looping past header 
     for (Entry e = header.next; e.element != null; e = e.next) { 
      index++; 
     } 
     // if index < size, null was found, else we looped to header 
     return (index < size) ? index: -1; 
    } else { 
     for (Entry e = header.next; e != header; e = e.next) { 
      if (o.equals(e.element)) 
       return index; 
      index++; 
     } 
    } 
    return -1; 
} 

我々はlastIndexOfでも(に似た変換を適用した場合)、それは非常にきれいな結果が得られます。

public int lastIndexOf(Object o) { 
    int index = size - 1; 
    if (o==null) { 
     for (Entry e = header.previous; e.element != null; 
      e = e.previous, index--); 
    } else { 
     for (Entry e = header.previous; e != header && !o.equals(e.element); 
      e = e.previous, index--); 
    } 
    return index; 
} 

は、それが意図的ですか?

+0

このコードはどこから来たのですか?コメントによると、このリストのヘッダーは常にnull要素を持っています。どの最適化をご紹介しますか? –

答えて

1

私はJREは、あなたが参照しているかわからないんだけど、シンタックスシュガーのほかに、私が見る唯一の関連の違いはこれです:

// if index < size, null was found, else we looped to header 
return (index < size) ? index: -1; 
我々は最後の要素で開始 lastIndexOf()のためにその理由がある

、見逃してしまうと、ヘッダーにインデックス-1が入ります。しかし、indexOf()の場合、0番目の要素から開始し、見逃した場合はindex == sizeというヘッダーになりますが、余分な条件を追加する必要があるため、-1を返します。

関連する問題