2017-03-02 144 views
1

真的很想知道爲什麼鏈表中的indexof()沒有利用「header」條目有一個null元素來提高性能,當它傳遞一個null「target 「:LinkedList的indexOf()與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

此代碼來自哪裏?根據評論,這個列表的頭部總是有一個空元素。那麼你想介紹哪種優化? –

回答

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,所以我們必須添加額外的條件。