Java中List.of()和Arrays.asList()的區(qū)別及原因分析
Java中List.of()和Arrays.asList()的區(qū)別及原因
動(dòng)手寫一下,讓自己更有印象
1.Arrays.asList()可以插入null
而List.of()不可以
import java.util.List; import java.util.Arrays; class Solution { public static void main(String[] args) { List<Integer> ls1 = Arrays.asList(1, 2, null); //List<Integer> ls2 = List.of(1,2,null); System.out.println(ls1); //System.out.println(ls2); } } /*結(jié)果 [1, 2, null] */
import java.util.List; import java.util.Arrays; class Solution { public static void main(String[] args) { //List<Integer> ls1 = Arrays.asList(1, 2, null); List<Integer> ls2 = List.of(1,2,null); //System.out.println(ls1); System.out.println(ls2); } } /*結(jié)果 Exception in thread "main" java.lang.NullPointerException..... */
2.用List.of的List自然是不包含null
而用Arrays.asList的List包含null。上面結(jié)果也可得知。
import java.util.List; import java.util.Arrays; class Solution { public static void main(String[] args) { List<Integer> ls1 = Arrays.asList(1, 2, null); //List<Integer> ls2 = List.of(1,2); System.out.println(ls1.contains(null)); //System.out.println(ls2.contains(null)); } } /*結(jié)果 true */
import java.util.List; import java.util.Arrays; class Solution { public static void main(String[] args) { //List<Integer> ls1 = Arrays.asList(1, 2, null); List<Integer> ls2 = List.of(1,2); //System.out.println(ls1.contains(null)); System.out.println(ls2.contains(null)); } } /*結(jié)果 Exception in thread "main" java.lang.NullPointerException..... */
3.List.of生成的List不能修改
Arrays.asList生成的List能修改。
import java.util.List; import java.util.Arrays; class Solution { public static void main(String[] args) { List<Integer> ls1 = Arrays.asList(1, 2, null); //List<Integer> ls2 = List.of(1,2); ls1.set(0,5); //ls2.set(0,5); System.out.println(ls1); //System.out.println(ls2); } } /*結(jié)果 [5, 2, null] */
import java.util.List; import java.util.Arrays; class Solution { public static void main(String[] args) { //List<Integer> ls1 = Arrays.asList(1, 2, null); List<Integer> ls2 = List.of(1,2); //ls1.set(0,5); ls2.set(0,5); //System.out.println(ls1); System.out.println(ls2); } } /*結(jié)果 Exception in thread "main" java.lang.UnsupportedOperationExceptio..... */
4.關(guān)于數(shù)組修改對(duì)List的影響
數(shù)組修改對(duì)Arrays.asList生成的List有影響,對(duì)List.of 生成的List無(wú)影響
import java.util.List; import java.util.Arrays; class Solution { public static void main(String[] args) { Integer[] a = new Integer[]{1,2,3,4}; // 不能用int[],會(huì)導(dǎo)致轉(zhuǎn)型錯(cuò)誤,錯(cuò)誤: 不兼容的類型: 推論變量 T 具有不兼容的上限 List<Integer> ls1 = Arrays.asList(a); //List<Integer> ls2 = List.of(a); System.out.println(ls1); //System.out.println(ls2); a[0] = 5; //ls2.set(0,5); System.out.println(ls1); //System.out.println(ls2); } } /*結(jié)果 [1, 2, 3, 4] [5, 2, 3, 4] */
import java.util.List; import java.util.Arrays; class Solution { public static void main(String[] args) { Integer[] a = new Integer[]{1,2,3,4}; //List<Integer> ls1 = Arrays.asList(a); List<Integer> ls2 = List.of(a); //System.out.println(ls1); System.out.println(ls2); a[0] = 5; //ls2.set(0,5); //System.out.println(ls1); System.out.println(ls2); } } /*結(jié)果 [1, 2, 3, 4] [1, 2, 3, 4] */
原因
關(guān)于List.of為什么不能插入null,和修改了原數(shù)組不影響到List.of生成的List。先看看List.of有關(guān)的源碼
@SafeVarargs @SuppressWarnings("varargs") static <E> List<E> of(E... elements) { switch (elements.length) { // implicit null check of elements case 0: return ImmutableCollections.emptyList(); case 1: return new ImmutableCollections.List12<>(elements[0]); case 2: return new ImmutableCollections.List12<>(elements[0], elements[1]); default: return new ImmutableCollections.ListN<>(elements); } } //--------------------------------------------------------------------------------------- @Stable private final E[] elements; @SafeVarargs ListN(E... input) { // copy and check manually to avoid TOCTOU @SuppressWarnings("unchecked") E[] tmp = (E[])new Object[input.length]; // implicit nullcheck of input for (int i = 0; i < input.length; i++) { tmp[i] = Objects.requireNonNull(input[i]); } elements = tmp; } //--------------------------------------------------------------------------------------- public static <T> T requireNonNull(T obj) { if (obj == null) throw new NullPointerException(); return obj; }
可以看到Objects.requireNonNull()。所以不能插入空值。
E[] tmp = (E[])new Object[input.length];表示新建了個(gè)新的數(shù)組對(duì)象,所以修改了原數(shù)組,不影響生成的LIst底層的數(shù)組。
返回的數(shù)組是個(gè)final類型的,所以不能修改
再看看Arrays.asList源碼
@SafeVarargs @SuppressWarnings("varargs") public static <T> List<T> asList(T... a) { return new ArrayList<>(a); } //---------------------------------------------------------------------------------------- ArrayList(E[] array) { a = Objects.requireNonNull(array); } //---------------------------------------------------------------------------------------- public static <T> T requireNonNull(T obj) { if (obj == null) throw new NullPointerException(); return obj; }
由源碼可知,底層的數(shù)組就是傳入的數(shù)組,所以對(duì)原數(shù)組的修改會(huì)影響到用Arrays.asList方法生成的List。而且Objects.requireNonNull(array)檢查的是整個(gè)數(shù)組是不是null,而非對(duì)每個(gè)元素進(jìn)行檢查是否為null。所以用Arrays.asList方法可以插入空值。
也沒(méi)有規(guī)定是final的,所以支持修改。
java listof報(bào)錯(cuò)處理
List.of()生成不可變數(shù)組(字符串也行)
是在jdk1.8以后才出現(xiàn)的,在jdk1.9版本及以后才能運(yùn)行。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot整合Ldap的實(shí)現(xiàn)示例
本文主要介紹了SpringBoot整合Ldap的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-11-11由ArrayList來(lái)深入理解Java中的fail-fast機(jī)制
fail-fast俗稱快速失敗,是在多線程進(jìn)行迭代操作時(shí)產(chǎn)生沖突的一種異常拋出機(jī)制,下面我們就由ArrayList來(lái)深入理解Java中的fail-fast機(jī)制.2016-05-05springmvc json類型轉(zhuǎn)換錯(cuò)誤解決方案
這篇文章主要介紹了springmvc json類型轉(zhuǎn)換錯(cuò)誤解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12Java SpringBoot實(shí)現(xiàn)AOP
AOP包括連接點(diǎn)(JoinPoint)、切入點(diǎn)(Pointcut)、增強(qiáng)(Advisor)、切面(Aspect)、AOP代理(AOP Proxy),具體的方法和類型下面文章會(huì)舉例說(shuō)明,感興趣的小伙伴和小編一起閱讀全文吧2021-09-09解決mybatis-plus3.4.1分頁(yè)插件PaginationInterceptor和防止全表更新與刪除插件SqlE
這篇文章給大家介紹了在Spring.xml文件中配置mybatis-plus3.4.1分頁(yè)插件PaginationInterceptor和防止全表更新與刪除插件SqlExplainInterceptor過(guò)時(shí)失效問(wèn)題解決方案,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2020-12-12jdk7 中HashMap的知識(shí)點(diǎn)總結(jié)
HashMap的原理是老生常談了,不作仔細(xì)解說(shuō)。一句話概括為HashMap是一個(gè)散列表,它存儲(chǔ)的內(nèi)容是鍵值對(duì)(key-value)映射。這篇文章主要總結(jié)了關(guān)于jdk7 中HashMap的知識(shí)點(diǎn),需要的朋友可以參考借鑒,一起來(lái)看看吧。2017-01-01Spring應(yīng)用中使用acutator/refresh刷新屬性不生效的問(wèn)題分析及解決
在Spring應(yīng)用收到/actuator/refresh的POST請(qǐng)求后,標(biāo)注了@RefreshScope以及@ConfiguratioinProperties的bean會(huì)被Spring容器重新加載,但是,在實(shí)際應(yīng)用中,并沒(méi)有按照預(yù)期被Spring容器加載,本文將討論導(dǎo)致這種未按預(yù)期刷新的一種原因,感興趣的朋友可以參考下2024-01-01