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í)。然而,對(duì)于需要不可變集合的場(chǎng)景,這種方法提供了簡(jiǎn)潔性和安全性。類型安全:由于
List.of()
是一個(gè)泛型方法,它可以確保列表的類型安全。使用場(chǎng)景:
List.of()
非常適用于創(chuàng)建常量列表、配置列表或作為方法參數(shù)傳遞的不可變列表。元素限制:直接通過
List.of()
方法最多可以傳遞十個(gè)元素。如果需要更多元素,請(qǐng)考慮使用其他集合構(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á)到了類似的效果。 // 更簡(jiǎn)潔但非純不可變的方法(如果不需要完全的不可變性) List<Integer> simplerCombinedList = new ArrayList<>(firstHalf); simplerCombinedList.addAll(secondHalf); // 注意:simplerCombinedList 是可變的
上面的 simplerCombinedList
示例是可變的,而 combinedList
示例則通過 Collections.unmodifiableList()
嘗試創(chuàng)建一個(gè)不可變列表,但它不是由 List.of()
直接創(chuàng)建的。對(duì)于完全由 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)容可以被間接修改,例如,如果列表包含的是可變對(duì)象(如
ArrayList
或自定義對(duì)象),那么這些對(duì)象的內(nèi)部狀態(tài)可以被更改
2. 性能對(duì)比
List.of()
- 針對(duì)少量元素進(jìn)行了優(yōu)化,通常更適合創(chuàng)建固定且不可變的少量元素列表
- 內(nèi)部實(shí)現(xiàn)可能根據(jù)元素?cái)?shù)量不同而有所不同(例如,針對(duì)單個(gè)元素、兩個(gè)元素等使用專門的類)
Arrays.asList()
- 基于現(xiàn)有的數(shù)組實(shí)現(xiàn),因此性能開銷較低,特別是在處理大量元素時(shí)
- 但是,由于它是固定大小的,如果需要?jiǎng)討B(tài)調(diào)整列表大小,性能可能不如
ArrayList
3. 適用場(chǎng)景
List.of()
- 適用于需要不可變列表的場(chǎng)景。例如作為常量、配置數(shù)據(jù)或任何不希望被修改的數(shù)據(jù)集合
Arrays.asList()
- 適用于需要將現(xiàn)有數(shù)組轉(zhuǎn)換為列表的場(chǎng)景,或者當(dāng)你知道列表大小不會(huì)改變但需要列表功能(如迭代、索引訪問)時(shí)
總結(jié)
到此這篇關(guān)于Java 9中List.of()的使用示例及注意事項(xiàng)的文章就介紹到這了,更多相關(guān)Java9 List.of()的使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring?Data?JPA實(shí)現(xiàn)持久化存儲(chǔ)數(shù)據(jù)到數(shù)據(jù)庫(kù)的示例代碼
Spring Data JPA是Spring基于JPA規(guī)范的基礎(chǔ)上封裝的?套 JPA 應(yīng)?框架,可使開發(fā)者?極簡(jiǎn)的代碼即可實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的訪問和操作。本文我們來了解如何用Spring?Data?JPA框架實(shí)現(xiàn)數(shù)據(jù)持久化存儲(chǔ)到數(shù)據(jù)庫(kù),感興趣的可以了解一下2022-04-04Spring boot搭建web應(yīng)用集成thymeleaf模板實(shí)現(xiàn)登陸
這篇文章主要介紹了Spring boot搭建web應(yīng)用集成thymeleaf模板實(shí)現(xiàn)登陸,頁(yè)面使用bootstrap,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12SpringBoot中整合Shiro實(shí)現(xiàn)權(quán)限管理的示例代碼
這篇文章主要介紹了SpringBoot中整合Shiro實(shí)現(xiàn)權(quán)限管理的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09Spring?AOP實(shí)現(xiàn)多數(shù)據(jù)源動(dòng)態(tài)切換
本文主要介紹了Spring?AOP實(shí)現(xiàn)多數(shù)據(jù)源動(dòng)態(tài)切換,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03詳細(xì)聊一聊JavaWeb中的Request和Response
這篇文章主要給大家介紹了關(guān)于JavaWeb中Request和Response的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-02-02Java設(shè)置PDF有序和無序列表的知識(shí)點(diǎn)總結(jié)
在本篇文章中小編給大家整理了關(guān)于Java設(shè)置PDF有序和無序列表的知識(shí)點(diǎn),需要的朋友們參考下。2019-03-03SpringBoot配置文件、多環(huán)境配置、讀取配置的4種實(shí)現(xiàn)方式
SpringBoot支持多種配置文件位置和格式,其中application.properties和application.yml是默認(rèn)加載的文件,配置文件可以根據(jù)環(huán)境通過spring.profiles.active屬性進(jìn)行區(qū)分,命令行參數(shù)具有最高優(yōu)先級(jí),可覆蓋其他所有配置2024-09-09