簡體   English   中英

如何將List <String>轉換為ArrayList <String>

[英]How to convert List<String> to an ArrayList<String>

此API調用返回一個可能很大的List <String>,它沒有排序。 我需要對它進行排序,搜索和訪問隨機元素。 目前List由ArrayList實現(我檢查了源代碼),但是在未來的某個未知點,API開發人員可能會選擇切換到LinkedList實現(不更改接口)。

對我的程序進行排序,搜索,訪問可能很大的LinkedList將是非常緩慢和不可接受的。 因此我需要將List轉換為ArrayList以確保我的程序的實際效率。 但是,由於List很可能已經是ArrayList,因此不必要地創建List的新ArrayList副本是低效的。

鑒於這些約束,我提出了以下方法將List轉換為ArrayList:

private static <T> ArrayList<T> asArrayList(List<T> list) {
  if (list instanceof ArrayList) {
    return (ArrayList<T>) (list);
  } else {
    return new ArrayList<T>(list);
  }
}

我的問題是:這是使用未知實現的List的最有效方法嗎? 有沒有更好的方法將List轉換為ArrayList? 有沒有比將List轉換為ArrayList更好的選擇?

你不可能真正比你得到的更簡單 - 看起來盡可能高效,對我來說。

也就是說,這聽起來非常像過早優化 - 如果您正在使用的API的作者更改為LinkedList您應該只需要擔心這一點。 如果你現在擔心它,你可能會花費大量的時間和精力來規划未來甚至可能未完成的方案 - 現在是花時間尋找其他問題來解決的問題。 大概是你唯一一次改變API的版本是在你自己的應用程序版本之間 - 如果有的話,處理這個問題。

正如您自己所看到的,代碼很簡單,而且效率很高,因為它只在必要時才創建副本。

所以答案是沒有明顯更好的選擇,除了完全不同類型的解決方案,例如,對您的列表進行排序的東西。

(請記住,很少需要這種級別的優化,因此這不是一個非常常見的問題。)

更新:只是事后的想法,作為一般規則,編寫良好的API不會返回不適合它們可能包含的數據量的數據類型。 這並不是說你應該盲目地信任他們,但這並不是一個完全不合理的假設。

對我的程序進行排序,搜索,訪問可能很大的LinkedList將是非常緩慢和不可接受的。

實際上,它並沒有那么糟糕。 IIRC,Collections.sort方法將列表復制到臨時數組,對數組進行排序, clear()原始列表並將數組復制回它。 對於足夠大的列表, O(NlogN)排序階段將主導O(N)復制階段。

支持高效隨機訪問的Java集合實現了RandomAccess標記接口。 對於這樣的列表,您可以直接在列表上運行Collections.sort 對於沒有隨機訪問的列表,您可能應該使用其中一個toArray方法將列表轉儲到數組,對該數組進行排序,然后將其包裝到隨機訪問List

T[] array = (T[])list.toArray(); // just suppress the warning if the compiler worries about unsafe cast
Arrays.sort(array);
List<T> sortedList = Arrays.asList(array);

我認為Arrays.asList實際上創建了一個ArrayList ,所以如果你願意,你可以嘗試轉換它的結果。

Collections.sort對所有List實現都很有效,只要它們提供有效的ListIterator 該方法將列表轉儲到數組中,對其進行排序,然后使用ListIterator將值復制回O(n)中的列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM