Java?9中List.of()的使用示例及注意事項(xiàng)
前言
List.of() 是 Java 9 引入的一個(gè)靜態(tài)方法,用于創(chuàng)建不可變的列表(ImmutableList)。這意味著一旦使用 List.of() 創(chuàng)建了列表,你就不能向其中添加、刪除或修改元素。這個(gè)方法提供了一種方便的方式來創(chuàng)建包含零個(gè)或多個(gè)元素的不可變列表。
List.of() 方法有幾個(gè)重載版本,允許你傳遞零個(gè)到十個(gè)元素作為參數(shù)。如果你需要?jiǎng)?chuàng)建包含超過十個(gè)元素的列表,你可以使用 List.of() 方法來組合較小的列表,或者使用其他集合構(gòu)造方法(如 Arrays.asList() 后跟 Collections.unmodifiableList(),盡管這不是一個(gè)純粹的不可變列表,因?yàn)樗匀豢梢酝ㄟ^原始數(shù)組進(jìn)行修改)。
基本用法
// 創(chuàng)建一個(gè)空的不可變列表
List<String> emptyList = List.of();
// 創(chuàng)建一個(gè)包含單個(gè)元素的不可變列表
List<Integer> singleElementList = List.of(1);
// 創(chuàng)建一個(gè)包含多個(gè)元素的不可變列表
List<String> multipleElementsList = List.of("apple", "banana", "cherry");注意事項(xiàng)
不可變性:一旦創(chuàng)建,列表的內(nèi)容就不能更改。嘗試添加、刪除或修改元素將導(dǎo)致
UnsupportedOperationException。性能:由于不可變性,
List.of()創(chuàng)建的列表在性能上可能不是最優(yōu)的,特別是在進(jìn)行大量修改操作時(shí)。然而,對于需要不可變集合的場景,這種方法提供了簡潔性和安全性。類型安全:由于
List.of()是一個(gè)泛型方法,它可以確保列表的類型安全。使用場景:
List.of()非常適用于創(chuàng)建常量列表、配置列表或作為方法參數(shù)傳遞的不可變列表。元素限制:直接通過
List.of()方法最多可以傳遞十個(gè)元素。如果需要更多元素,請考慮使用其他集合構(gòu)造方法或組合多個(gè)List.of()調(diào)用。
示例:組合多個(gè) List.of() 調(diào)用
// 創(chuàng)建兩個(gè)較小的不可變列表
List<Integer> firstHalf = List.of(1, 2, 3, 4);
List<Integer> secondHalf = List.of(5, 6, 7, 8, 9, 10);
// 使用 Stream 將它們組合成一個(gè)較大的不可變列表
List<Integer> combinedList = Stream.concat(firstHalf.stream(), secondHalf.stream())
.collect(Collectors.collectingAndThen(Collectors.toList(), Collections::unmodifiableList));
// 注意:上面的 combinedList 實(shí)際上不是純粹的 List.of() 創(chuàng)建的不可變列表,
// 但它通過使用 Collections.unmodifiableList() 達(dá)到了類似的效果。
// 更簡潔但非純不可變的方法(如果不需要完全的不可變性)
List<Integer> simplerCombinedList = new ArrayList<>(firstHalf);
simplerCombinedList.addAll(secondHalf);
// 注意:simplerCombinedList 是可變的上面的 simplerCombinedList 示例是可變的,而 combinedList 示例則通過 Collections.unmodifiableList() 嘗試創(chuàng)建一個(gè)不可變列表,但它不是由 List.of() 直接創(chuàng)建的。對于完全由 List.of() 創(chuàng)建的不可變列表,你應(yīng)該直接傳遞元素給 List.of(),或者如果元素?cái)?shù)量超過限制,則考慮使用其他設(shè)計(jì)。
附:List.of() 和 Array.asList() 的區(qū)別
List.of()和 Array.asList()都是 Java 中用于創(chuàng)建列表的兩種不同方法,它們都可以用來創(chuàng)建列表。但它們也有一些顯著的區(qū)別,下面筆者將講解下它們的主要區(qū)別
1. 不可變性和可變性
List.of()
- 創(chuàng)建出來的列表是不可變的
- 此列表一旦創(chuàng)建,列表中的元素就不能被修改(添加、刪除或更改元素)
- 當(dāng)我們嘗試修改此方法構(gòu)造出來的列表時(shí),會(huì)報(bào)錯(cuò)
UnsupportedOperationException
Arrays.asList()
- 創(chuàng)建的列表是基于原始數(shù)組的固定大小的列表(fixed-size)
- 列表的大小是固定的,不能添加或刪除元素
- 但是,列表中的元素是可變的,可以修改元素
- 底層數(shù)組的內(nèi)容可以被間接修改,例如,如果列表包含的是可變對象(如
ArrayList或自定義對象),那么這些對象的內(nèi)部狀態(tài)可以被更改
2. 性能對比
List.of()
- 針對少量元素進(jìn)行了優(yōu)化,通常更適合創(chuàng)建固定且不可變的少量元素列表
- 內(nèi)部實(shí)現(xiàn)可能根據(jù)元素?cái)?shù)量不同而有所不同(例如,針對單個(gè)元素、兩個(gè)元素等使用專門的類)
Arrays.asList()
- 基于現(xiàn)有的數(shù)組實(shí)現(xiàn),因此性能開銷較低,特別是在處理大量元素時(shí)
- 但是,由于它是固定大小的,如果需要?jiǎng)討B(tài)調(diào)整列表大小,性能可能不如
ArrayList
3. 適用場景
List.of()
- 適用于需要不可變列表的場景。例如作為常量、配置數(shù)據(jù)或任何不希望被修改的數(shù)據(jù)集合
Arrays.asList()
- 適用于需要將現(xiàn)有數(shù)組轉(zhuǎn)換為列表的場景,或者當(dāng)你知道列表大小不會(huì)改變但需要列表功能(如迭代、索引訪問)時(shí)
總結(jié)
到此這篇關(guān)于Java 9中List.of()的使用示例及注意事項(xiàng)的文章就介紹到這了,更多相關(guān)Java9 List.of()的使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Gradle構(gòu)建Java項(xiàng)目指定JDK版本與編譯參數(shù)實(shí)戰(zhàn)演練
Gradle是一種流行的構(gòu)建工具,廣泛用于Java、Android和其他項(xiàng)目,通過配置環(huán)境變量,您可以更好地控制Gradle構(gòu)建過程,這篇文章主要介紹了Gradle構(gòu)建Java項(xiàng)目指定JDK版本與編譯參數(shù)的相關(guān)資料,需要的朋友可以參考下2026-04-04
java實(shí)現(xiàn)遠(yuǎn)程桌面的實(shí)例代碼
下面小編就為大家分享一篇java實(shí)現(xiàn)遠(yuǎn)程桌面的實(shí)例代碼,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-01-01
JAVA 聚焦 OutOfMemoryError 異常問題記錄
在 Java 開發(fā)中,內(nèi)存溢出異常是影響程序穩(wěn)定性的關(guān)鍵問題,了解其原理和應(yīng)對方法,對開發(fā)者至關(guān)重要,這篇文章主要介紹了JAVA聚焦 OutOfMemoryError 異常,需要的朋友可以參考下2025-04-04
Java抽象類和普通類區(qū)別、 數(shù)組跟List的區(qū)別解析
這篇文章主要介紹了Java抽象類和普通類區(qū)別、 數(shù)組跟List的區(qū)別,在這里需要注意List是一個(gè)接口,不能直接實(shí)例化,需要使用具體的實(shí)現(xiàn)類來創(chuàng)建對象,本文結(jié)合示例代碼介紹的非常詳細(xì),需要的朋友參考下吧2023-09-09
java WSDL接口webService實(shí)現(xiàn)方式
這篇文章主要為大家詳細(xì)介紹了java WSDL接口webService實(shí)現(xiàn)方式的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04
詳解Spring Cloud Gateway基于服務(wù)發(fā)現(xiàn)的默認(rèn)路由規(guī)則
這篇文章主要介紹了詳解Spring Cloud Gateway基于服務(wù)發(fā)現(xiàn)的默認(rèn)路由規(guī)則,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-05-05
SpringBoot帶你實(shí)現(xiàn)一個(gè)點(diǎn)餐小程序
有個(gè)小伙伴臨時(shí)找到我,要開發(fā)一個(gè)點(diǎn)餐的系統(tǒng),時(shí)間比較著急,給了2天的時(shí)間。馬馬虎虎的搞出來了,頭發(fā)掉了一撮!下面介紹下本系統(tǒng),感興趣的小伙伴,可以參考開發(fā)下2022-07-07

