2013-01-04 100 views
-6

我正在通過java ArrayList源代碼進行搜索,以查看將列表轉換爲數組時發生了什麼。 我遇到了包含我使用分配和知道的方法,我對該方法的第一個反應是,包含方法使用哪種算法。Java列表包含方法

public boolean contains(Object o) { 
    return indexOf(o) >= 0; 
} 

public int indexOf(Object o) { 
    if (o == null) { 
    for (int i = 0; i < size; i++) 
     if (elementData[i]==null) 
      return i; 
    } else { 
    for (int i = 0; i < size; i++) 
     if (o.equals(elementData[i])) 
      return i; 
    } 
    return -1; 
    } 

上面從源代碼中提取的代碼顯示ArrayLists正在使用順序搜索。 我看到很多人自己使用contains方法。 我認爲這是一個很好的例子,人們需要知道算法和Java集合。當你坐在一個包含大量項目的列表中時,每次使用應用程序時都會調用contains方法,這可能會成爲一個問題。

我能想到的一個改進就是使用二分查找。 僅當物品被分類時。 因此,您需要在從數據庫添加/查詢項目時訂購項目,或者在啓動應用程序時不使用數據庫訂單。

爲特定場景使用不同的集合還是使用其中一個util類來搜索ArrayList是更好?

+0

歡迎來到SO。請閱讀[FAQ]和[Ask]。提示:SO不是論壇,你沒有提出具體的問題,所以這篇文章可能會被封爲「不是真正的問題」。 –

+0

你有真正的問題嗎? – 2013-01-04 08:52:05

+2

我的意見:如果你有一個巨大的表現,表現開始傷害,你已經做錯了。 – Gimby

回答

2

不同的容器提供不同的性能保證和不同的時空折衷。

因此我的建議是:

  1. 研究數據結構;
  2. 研究您正在使用的容器庫。

這將幫助您就使用哪個容器以及如何最好地使用它做出明智的選擇。

+1

之前,您還需要先將列表轉換爲數組。二進制搜索不能默認,因爲並非所有列表都已排序,並且並非所有列表都包含Comparable元素。如果您的列表確實如此,那麼在大型數組中調用包含(..)是不理想的。你應該使用Collections.binarySearch(List <?而是延伸可比較的>列表,T鍵)。 – h22