Java中List.of()和Arrays.asList()的區(qū)別及原因分析
Java中List.of()和Arrays.asList()的區(qū)別及原因
動手寫一下,讓自己更有印象
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ù)組修改對List的影響
數(shù)組修改對Arrays.asList生成的List有影響,對List.of 生成的List無影響
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[],會導(dǎo)致轉(zhuǎn)型錯誤,錯誤: 不兼容的類型: 推論變量 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];表示新建了個新的數(shù)組對象,所以修改了原數(shù)組,不影響生成的LIst底層的數(shù)組。
返回的數(shù)組是個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ù)組,所以對原數(shù)組的修改會影響到用Arrays.asList方法生成的List。而且Objects.requireNonNull(array)檢查的是整個數(shù)組是不是null,而非對每個元素進(jìn)行檢查是否為null。所以用Arrays.asList方法可以插入空值。
也沒有規(guī)定是final的,所以支持修改。
java listof報錯處理
List.of()生成不可變數(shù)組(字符串也行)
是在jdk1.8以后才出現(xiàn)的,在jdk1.9版本及以后才能運行。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot3實現(xiàn)優(yōu)雅停機(jī)的完整流程
在現(xiàn)代微服務(wù)架構(gòu)中,優(yōu)雅停機(jī)(Graceful Shutdown)是一項重要功能,可以確保服務(wù)在關(guān)閉時處理完所有當(dāng)前請求,避免突然終止連接或丟失數(shù)據(jù),Spring Boot 3 提供了對優(yōu)雅停機(jī)的內(nèi)置支持,本文給大家介紹了SpringBoot3怎樣優(yōu)雅停機(jī),需要的朋友可以參考下2024-10-10
feign調(diào)用第三方接口,編碼定義GBK,響應(yīng)中文亂碼處理方式
這篇文章主要介紹了feign調(diào)用第三方接口,編碼定義GBK,響應(yīng)中文亂碼處理方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01
使用Java實現(xiàn)在Excel中創(chuàng)建下拉列表
下拉列表(下拉框)可以確保用戶僅從預(yù)先給定的選項中進(jìn)行選擇,這樣不僅能減少數(shù)據(jù)輸入錯誤,還能節(jié)省時間提高效率,下面我們就來看看如何在java中利用免費庫實現(xiàn)創(chuàng)建下拉列表吧2024-03-03
Java關(guān)于遠(yuǎn)程調(diào)試程序教程(以Eclipse為例)
這篇文章主要介紹了Java關(guān)于遠(yuǎn)程調(diào)試程序教程(以Eclipse為例),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-06-06
java開發(fā)https請求ssl不受信任問題解決方法
這篇文章主要介紹了java開發(fā)https請求ssl不受信任問題解決方法,具有一定借鑒價值,需要的朋友可以參考下2018-01-01
java 利用HttpClient PostMethod提交json數(shù)據(jù)操作
這篇文章主要介紹了java 利用HttpClient PostMethod提交json數(shù)據(jù)操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01

