10
回答
请问这段JAVA代码为何返回false
终于搞明白,存储TCO原来是这样算的>>>   
import java.io.*;
import java.util.*;
class Untitled {
	public static void main(String[] args) {
		int[] a={2,3,45,6};
		
		System.out.println(Arrays.asList(a).contains(2));
	}
}

 

<无标签>
举报
lcccd
发帖于2周前 10回/286阅
共有10个答案 最后回答: 2周前

引用来自“Salty_Egg”的评论

@tcxu 所说,是封装类的问题,这样改一下就没问题了:

Integer[] a={2,3,45,6};

用int[], Arrays.asList返回的是List<int[]>

以下代码证明:用int[], Arrays.asList返回的是List<int[]>

import java.io.*;
import java.util.*;
class WrapperClassTest{
	public static void main(String[] args) {
	int[] a = {2,3,45,6};	//实例化一个整型数组对象
	/* 将 a 放到列表 list 之中。列表中元素都是整型数组对象 */	
	List<int[]> list = Arrays.asList(a);
	System.out.println("列表的长度: " + list.size());//输出列表中元素的个数
	System.out.print("这个列表中仅有的一个元素是 <int[]> 型\n其详情内容是:" );
	for (int i=0; i< list.get(0).length; i++) //输出列表仅有的这个元素<int[]>的详情
	System.out.print(list.get(0)[i] + " "); 
	/* 因为列表中只有一个 <int[]> 对象,它不是 new Integer(2)对象,
	 * 故调用 contains(2)的搜寻结果,是false. */
	System.out.println("\n调用方法contains(2), 返回:");
	System.out.println(list.contains(2)); 	
 		}
}

输出:

列表的长度: 1
这个列表中仅有的一个元素是 <int[]> 型
其详情内容是:2 3 45 6
调用方法contains(2), 返回:
false

泛形只包括对象类型,而基本数据类型, 如 int, 在java里不属于对象, 因此, List<int> 的表示,是不成立的。

Arrays 的静态方法 public static <T> List<T> asList(T... a) 要求参数的类型为<T>,即 泛型。因此,它只接收(泛型)对象。 int [] a  是一个整型数组对象, 它是作为一个特定的对象, 放到 Arrays.asList(a) 的 (阿亮~说的没错!)。故 返回的列表,只有一个元素: 这个整形数组对象。当然不会包含 2。使得 最后调用 contains(2) 的结果为 false。

鉴于基本数据类型都有它们自己的包装类型,而每一个整型数都对应一个包装类 Integer 的对象,因此把这个整型数组改写成 Integer对象的 数组:

Integer [] a={new Integer(2),new Integer(3),new Integer(45),new Integer(6)};

这样,返回值为List<Integer>, 即Integer对象列表。

这时,调用 Arrays.asList(a), 返回的列表中, 定有 2所对应的包装类对象。

最后调用 contains(2),由于contains(Object  )要求参数为对象,使得 2 自动转换成 new Integer(2),    结果返回为 true。

测试代码如下:

import java.io.*;
import java.util.*;
class Untitled {
	public static void main(String[] args) {
	Integer[] a={new Integer(2),new Integer(3),new Integer(45),new Integer(6)};
	for (int i=0; i< Arrays.asList(a).size(); i++)
	System.out.print(Arrays.asList(a).get(i) + " "); 
	System.out.println(Arrays.asList(a).contains(2));	
 		}
}

输出:

2 3 45 6 true

换成Integer[] b = { 2, 3, 45, 6 };

      System.out.println(Arrays.asList(b).size());

在asList方法参数中,int[]数组只是当作一个类型,而不是多个int。

@tcxu 所说,是封装类的问题,这样改一下就没问题了:

Integer[] a={2,3,45,6};

用int[], Arrays.asList返回的是List<int[]>

  Integer[] a = {2,3,45,6}; 
 List<Integer> list = Arrays.asList(a);

 

int[] a = {2,3,45,6};  
List<int[]> list = Arrays.asList(a);

...是会包装成数组类型的,int[]是基本类型不是对象,说以会包装成数组对象,最后再装箱拆箱

顶部