簡體   English   中英

為什么我們在 Lists 類中有 TwoPlusArrayList 和 OnePlusArrayList ?

[英]Why Do we have TwoPlusArrayList and OnePlusArrayList inside Lists class?

我只是對 google guava 的 Lists 類實現很好奇,我們有兩種方法可以從 Array 創建 List,

Lists.asList(E first, E[] rest)
Lists.asList(E first, E second, E[] rest)

為什么這些方法有先有后有之分呢? 它不能像 java 的 Arrays.asList 實現嗎?

我唯一能看到的是第一個和第二個是可為空的,其余的不可為空

任何人都可以幫助理解這一點嗎?

好的,所以 Lists.asList() 的工作並不是直接將數組轉換為列表。

假設我們有一個數組,我們想向其中插入一個元素,因為數組大小是固定的,所以我們不能這樣做。 這個問題的一個解決方案是分配一個原始數組大小 +1 的新數組,並將原始數組中的所有元素復制到新數組中。 這有效,但效率極低。

Guava 為這個問題提供了一個有效的解決方案Lists.asList()Lists.asList()方法返回一個不可修改的列表,該列表由原始數組支持,該數組也包含指定的元素。

來源: https : //www.techiedelight.com/guava-lists-class-java/

所以基本上,您可以使用它來轉換數組,方法是將第一個和/或第二個參數(取決於您使用的方法)作為空值,並將“rest”參數作為您的數組。

這會將您的數組作為列表返回,可能將 null 作為第一個索引(第二個也是如此,取決於您使用的是什么)

但是如果你願意,你可以使用相同的方法來獲取一個列表,其中包含一些附加到數組的特定數據(在第一個和第二個索引值處)

希望這是有幫助的!

這些方法存在的主要原因是在您編寫具有類似簽名的方法時為您提供幫助

void foo(Bar first, Bar... rest);

當您希望允許用戶調用該方法時,您會這樣做,就好像它是一個只有一個可變參數的方法,但您希望要求它至少使用一個或兩個參數來調用(而 varargs單獨將允許他們用零調用它)。 在此類方法的實現中,您可能希望將這些參數視為單個列表。 Lists.asList無需進行任何數組復制即可做到這一點:

void foo(Bar first, Bar... rest) {
  List<Bar> bars = Lists.asList(first, rest);
  // ...
}

暫無
暫無

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

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