目的: 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() );
}
奇怪的是,无论a[0]
,a[1]
,a[2]
为何,它都将结果返回为1。
如果使用ArrayList
而不是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());
}
结果是0 2
。
问题:应该同意asList
实用性的Arrays
API出了什么问题吗,例如错误或限制?
备注:
通过内部实现,我知道asList
会调用ArrayList
的构造函数:
public ArrayList(Collection<? extends E> c) {
elementData = c.toArray();
size = elementData.length;
.....
}
它再次调用集合的toArray
。但是,由于elementData.length
应该存储在大小值10
中,因此不确定为什么我们得到的答案是1吗?
答案 0 :(得分:2)
您得到1是因为org_data = ruamel.yaml.comments.CommentedMap()
org_data['description'] = 'pqr'
org_data['name'] = 'def'
返回Arrays.asList(int[] a)
,而不是List<int[]>
。
您使用方法List<Integer>
的方式不正确。如果您想获取asList()
,则应将数组的内容一一传递给方法List<Integer>
。
asList()
没有直接的方法可以快速将数组转换为List<Integer> list = Array.asList(30, 100, 33);
答案 1 :(得分:2)
您试图以某种方式将这三个概念等同起来。
首先,列表或数组中有null
个元素。 null
是两者中的一个完全有效的值。它与未初始化不同。实际上,默认情况下,任何非基本类型的数组都被显式初始化为null
。
然后,列表中有未使用的元素。
ArrayList<Integer> a = new ArrayList<>(20);
a.add(null);
您将拥有一个大小为List
的{{1}}。null
是粘贴在列表中的完全有效的引用,容量与大小无关。传递给构造函数的20个提示只是在将20个实际元素插入列表之前不要重新分配内存。其他19个元素不是null
。它们实际上不存在。
第三,存在原始数组的问题。创建基本数组时,它将具有固定长度,并且每个元素都包含一个有效值。默认情况下,使用false
,0
,0L
,0.0f
,0.0
或适用于该类型的任何东西对数组进行清零。您的代码将创建一个包含三个非零元素和七个零的数组。基元不是引用,因此绝对不能为null
。即使可以,从10个元素的数组中制作一个List
的大小也会为10。
您尝试创建ArrayList
绝不等于应用Arrays.asList()
,即使这样做是可行的。创建一个列表并向其中添加三个元素将生成一个大小为3的列表。最重要的是,请记住,List
只能 保存引用,对于您的情况,它们是对框式Integer
的引用。 Integer
引用可以是null
,并且仍然是有效的列表项,但不能将其拆箱成原始值。
最后,您无法使用asList
将基元数组转换为列表。 asList
接受varargs而不是单个列表,这就是为什么您总是以一个元素列表结尾的原因。这里的问题实际上是您有一个基元列表:引用数组将被很好地扩展。 Java 8中的替代方法是
List<Integer> list = Arrays.stream(ints).boxed().collect(Collectors.toList());
注意显式装箱操作。您列表的大小仍然是10,而不是3。
答案 2 :(得分:0)
没有直接方法可以从List
获取Array
... !!!
是,以上句子部分正确。
如果您的数组是原始类型的数组,它将创建一个包含整个数组的列表,作为新创建的列表的第一个元素。
赞:
public static void main(String[] args) {
int a[] = new int[10];
a[0] = 30;
a[1] = 100;
a[2] = 33;
List list = Arrays.asList(a);
}
但是,如果您的数组是任何引用类型,那么它将使用传递的数组的每个元素作为列表元素来创建。
public static void main(String[] args) {
Object a[] = new Object[10];
a[0] = 30;
a[1] = 100;
a[2] = 33;
List list = Arrays.asList(a);
}
这就是为什么在您的情况下,它只显示一个元素。
此行为是由于实现了asList()
,该实现直接调用ArrayList
构造函数。
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
答案 3 :(得分:0)
public class Test {
public static void main(String []args)
{
Integer a[] = new Integer[10];
a[0]=30;
a[1]=100;
a[2]=33;
//List<Integer> list=Arrays.asList(a);
System.out.println(Arrays.asList(a).size() );
}
}
输出
10
使用包装器类,这是您的解决方案。流到目前为止并没有达到您期望的效果。