目的: Array.length为我们提供初始化为数组的存储。但是想从初始化的总存储中找出存储在数组中的非空元素的数量。我知道很多方法都是可能的,但这里的问题与我使用的方法有关。
因为ArrayList有一个size()方法可以让我们计算存储的实际元素,而不管初始化的总存储量如何。
所以,我想到将数组转换为ArrayList并找出大小。因此我使用Arrays.asList(a).size()如下所示:
public class Driver {
public static void main(String []args)
{
int a[] = new int[10];
a[0]=30;
a[1]=100;
a[2]=33;
System.out.println((Arrays.asList(a)).size() );
}
Run Code Online (Sandbox Code Playgroud)
奇怪的是,无论a[0], a[1], ,它都返回结果为 1 a[2]。
如果我们使用 withArrayList而不是 Array执行相同的步骤,则会得到结果 3:
{
List<Integer> temp = new ArrayList<Integer>(20);
System.out.println(temp.size());
temp.add(20);
temp.add(40);
System.out.println(temp.size());
}
Run Code Online (Sandbox Code Playgroud)
结果是0 2。
问题:是否应该同意实用程序的asListAPI 有Arrays问题,例如错误或限制?
备注:
查看内部实现,我理解asList调用构造函数ArrayList:
public ArrayList(Collection<? extends E> c) {
elementData = c.toArray();
size = elementData.length;
.....
}
Run Code Online (Sandbox Code Playgroud)
它再次调用集合的toArray. 但是不确定为什么我们得到的答案是 1,因为elementData.length应该存储在 size 值中10?
你得到 1 因为Arrays.asList(int[] a)return List<int[]>,而不是List<Integer>。您使用方法的方式asList()不正确。如果你想得到List<Integer>,你应该将数组的内容asList()一一传递给方法。
List<Integer> list = Array.asList(30, 100, 33);
没有直接的方法可以将数组List即时转换为数组