我正在尝试检查我的数组是否包含给定元素。为此,我将该数组转换为列表,然后使用包含。但是,我遇到了这种奇怪的行为。
int[] arr = null;
System.out.println(Arrays.asList(arr).contains(1)); //output as false
System.out.println(Arrays.asList(null).contains(1)); //nullPointerException
为什么第一个不扔NPE?请提出建议。
最佳答案
原语代表值,对象变量代表引用。 null 是 java 中的一个关键字,它用于表示缺少某些东西或没有引用任何东西。 如果你创建像
这样的对象Object obj=new Object(); or Integer i=new Integer();
堆内存为引用变量obj和i分配一些空间。 当你分配 obj=null;或者我=空;这意味着 obj 和 i 不会指向该内存或其中的任何内存。
int[] arr=null;
这里arr是一个原始变量,它的值为null。
当您尝试通过 Arrays.asList(arr) 将数组转换为列表时,您传递的是空数组,但传递的是空数组。
因为
public static <T> List<T> asList(T... a) {
return new ArrayList<T>(a);
}
asList() 方法采用可变参数数组并返回列表。
当你写的时候
System.out.println(Arrays.asList (arr).contains(1)); //output as false
意味着您实际比较返回列表中的 1 和 contains(1) 方法检查列表中是否存在 1。
但是在第二条语句中 System.out.println(Arrays.asList (null).contains(1));
你传递的空值。
asList(null) 方法尝试
return new ArrayList<T>(a);
这意味着 return 语句调用
ArrayList(E[] array) {
if (array==null)
throw new NullPointerException();
a = array;
}
在第二个语句中你传递了 null。
如果 Integer[] arr = null;
你实际创建的 Integer 包装类对象和对象变量代表引用,这里 arr 是对象,它指的是 null。而 null 意味着引用nothing.So,这就是 System.out.println(Arrays.asList(null).contains(1));
throw NPE
关于 java 中的 null 你可以访问此链接以获取更多详细信息: 9 Things about Null in Java
关于Java,数组到 ArrayList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34193736/