簡體   English   中英

使用 Java 的 Collections.singletonList()?

[英]Use of Java's Collections.singletonList()?

Java 中Collections.singletonList()什么用? 我知道它返回一個包含一個元素的列表。 為什么我想要一個單獨的方法來做到這一點? 不變性在這里如何發揮作用?

這種方法是否有任何特殊有用的用例而不僅僅是一種方便的方法?

javadoc是這樣說的:

“返回一個僅包含指定對象的不可變列表。返回的列表是可序列化的。”

你問:

為什么我想要一個單獨的方法來做到這一點?

主要是為了方便...省去您必須編寫一系列語句來:

  • 創建一個空列表對象
  • 給它添加一個元素,然后
  • 用一個不可變的包裝器包裝它。

它也可能更快一些和/或節省一些內存,但這些小的節省不太可能是顯着的。 (至少可以說,創建大量單例列表的應用程序是不尋常的。)

不變性在這里如何發揮作用?

它是方法規范的一部分; 見上文。

這種方法是否有任何特殊有用的用例,而不僅僅是一種方便的方法?

顯然,有些用例可以方便地使用singletonList方法。 但我不知道您將如何(客觀地)區分普通用例和“特別有用”的用例......

這是單例方法的一種觀點

我發現這些不同的“單例”方法對於將單個值傳遞給需要該值集合的 API 很有用。 當然,這在處理傳入值的代碼不需要添加到集合時效果最好。

來自 javadoc

@param  the sole object to be stored in the returned list.
@return an immutable list containing only the specified object.

例子

import java.util.*;

public class HelloWorld {
    public static void main(String args[]) {
        // create an array of string objs
        String initList[] = { "One", "Two", "Four", "One",};

        // create one list
        List list = new ArrayList(Arrays.asList(initList));

        System.out.println("List value before: "+list);

        // create singleton list
        list = Collections.singletonList("OnlyOneElement");
        list.add("five"); //throws UnsupportedOperationException
        System.out.println("List value after: "+list);
    }
}

當代碼需要只讀列表時使用它,但您只想在其中傳遞一個元素。 singletonList是(線程)安全且快速的。

回答你不變的問題:

Collections.singletonList將創建一個不可變的列表。 不可變列表(也稱為不可修改列表)不能更改其內容。 如果您嘗試更改內容,添加或刪除項目的方法將引發異常。

單例列表僅包含該項目且不能更改。

如果一個 Immutable/Singleton 集合是指只有一個對象並且沒有被進一步修改的集合,那么可以通過創建一個只有一個對象的集合“UnmodifiableCollection”來實現相同的功能。 既然 Unmodifiable Collection 可以用一個對象實現同樣的功能,那么 Singleton Collection 有什么特殊用途呢?

singletonList 可以保存任何對象的實例。 對象狀態可以修改。

List<Character> list = new ArrayList<Character>();
list.add('X');
list.add('Y');
System.out.println("Initial list: "+ list);
List<List<Character>> list2 = Collections.singletonList(list);
list.add('Z');
System.out.println(list);
System.out.println(list2);

我們不能像上面那樣定義 unmodifiableList。

暫無
暫無

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

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