Java Arrays.asList()无法正常工作?
我有一个float[],我想得到一个包含相同元素的列表。我可以一个接一个地添加它们,但我想使用Arrays.asList方法。但是有一个问题。这项工作:Java Arrays.asList()无法正常工作?,java,arrays,list,variadic-functions,Java,Arrays,List,Variadic Functions,我有一个float[],我想得到一个包含相同元素的列表。我可以一个接一个地添加它们,但我想使用Arrays.asList方法。但是有一个问题。这项工作: List<Integer> list = Arrays.asList(1,2,3,4,5); List List=Arrays.asList(1,2,3,4,5); 但事实并非如此 int[] ints = new int[] {1,2,3,4,5}; List<Integer> list = Arrays.asLi
List<Integer> list = Arrays.asList(1,2,3,4,5);
List List=Arrays.asList(1,2,3,4,5);
但事实并非如此
int[] ints = new int[] {1,2,3,4,5};
List<Integer> list = Arrays.asList(ints);
int[]ints=newint[]{1,2,3,4,5};
List=Arrays.asList(ints);
asList方法接受一个varargs参数,据我所知,它是数组的“速记”
问题:
- 为什么第二段代码返回的是
,而不是列表
列表
- 有没有办法纠正它
- 为什么自动装箱在这里不起作用;i、 e.
到int[]
Integer[]
Integer[] ints = new Integer[] {1,2,3,4,5};
List<Integer> list = Arrays.asList(ints);
Integer[]ints=新整数[]{1,2,3,4,5};
List=Arrays.asList(ints);
Java中没有列表这样的东西,泛型不支持原语
自动装箱只针对单个元素,而不针对基元数组
至于如何纠正它——有各种各样的库,有很多方法可以做这样的事情。这是没有办法的,我认为在JDK中没有任何东西可以让它变得更容易。一些将在包装器类型的列表中包装一个基本数组(以便在访问时装箱),另一些将迭代原始数组以创建一个独立副本,并在执行时装箱。确保你知道你在使用哪一个
(编辑:我一直认为int[]
的起点是不可协商的。如果你可以从Integer[]
开始,那你就很好了:)
仅举一个帮助程序库的示例,插入一点。如果将int[]
传递给Arrays.asList()
,则创建的列表将是list
,这在java中不可用,而不是正确的列表
我认为您希望Arrays.asList()
自动装箱int,正如您所看到的,它不会。问题不在于Arrays.asList()
。问题是,您希望自动装箱在阵列上工作,但事实并非如此。在第一种情况下,编译器会在查看各个int的用途之前自动装箱。在第二种情况下,首先将它们放入一个int数组(无需自动装箱),然后将其传递给数组.asList()
(不可能自动装箱)。无法将int[]
转换为整数[]
,必须复制值
int[]tab=newint[]{1,2,3,4,5};
List List=ArraysHelper.asList(选项卡);
公共静态列表asList(int[]a){
列表=新的ArrayList();
对于(inti=0;i
输入Java 8,您可以执行以下操作以在盒式数组中进行收集:
Integer[] boxedInts = IntStream.of(ints).boxed().toArray(Integer[]::new);
或将其收集在装箱单中
List<Integer> boxedInts = IntStream.of(ints).boxed().collect(Collectors.toList());
最后一种形式可能更受欢迎,因为它省略了流的原始特定子类型。然而,在内部,它仍然是一堆重载的,在这种情况下,仍然在内部创建一个IntStream
。数组。asList(T…a)
有效地将一个T[]
数组作为数组,该数组将匹配任何真实对象数组(对象的子类)。唯一不匹配的是基元数组,因为基元类型不是从Object
派生的。因此int[]
不是对象[]
然后发生的是varags机制启动并将其视为传递了单个对象,并创建了该类型的单个元素数组。因此,您传递一个int[][]
(在这里,T
是int[]
),并最终得到一个1元素列表,这不是您想要的
不过,您仍然有一些不错的选择:
番石榴的Int.asList(Int[])
Adapter
如果您的项目已经使用了guava,那么只需使用guava提供的适配器即可。关联类中的每个基元类型都有一个类似的适配器,例如,Booleans
的boolean
等
int foo[] = {1,2,3,4,5};
Iterable<Integer> fooBar = Ints.asList(foo);
for(Integer i : fooBar) {
System.out.println(i);
}
intfoo[]={1,2,3,4,5};
Iterable fooBar=Ints.asList(foo);
for(整数i:fooBar){
系统输出打印LN(i);
}
这种方法的优点是,它在现有数组周围创建一个薄包装器,因此包装器的创建是固定时间的(不取决于数组的大小),并且除了底层整数数组之外,所需的存储量只有一小部分(小于100字节)
缺点是访问每个元素需要底层int
的装箱操作,而设置需要取消装箱。如果大量访问列表,这可能会导致大量的临时内存分配。如果平均多次访问每个对象,则最好使用一个实现,将对象装箱一次,并将其存储为Integer
。下面的解决方案就是这样做的
Java8IntStream
在Java8中,可以使用Arrays.stream(int[])
方法将int
数组转换为流。根据您的用例,您可能能够直接使用流,例如,使用流来处理每个元素。在这种情况下,此解决方案速度非常快,根本不会导致任何装箱或取消装箱,也不会创建基础阵列的任何副本
或者,如果您确实需要一个列表
,您也可以使用stream.boxed().collect(Collectors.toList())
。这种方法的缺点是它将列表中的每个元素都完全装箱,这可能会将其内存占用增加近一个数量级,它会创建一个新的Ob
List<Integer> boxedInts = IntStream.of(ints).boxed().collect(Collectors.toList());
Integer[] boxedIntArray = Arrays.stream(ints).boxed().toArray(Integer[]::new);
List<Integer> boxedIntList = Arrays.stream(ints).boxed().collect(Collectors.toList());
int foo[] = {1,2,3,4,5};
Iterable<Integer> fooBar = Ints.asList(foo);
for(Integer i : fooBar) {
System.out.println(i);
}
int[] x = new int[]{1};
int[] y = new int[]{1};
y[0] = 2;
IntList intList1 = IntLists.mutable.with(1,2,3,4,5);
int[] ints = new int[] {1,2,3,4,5};
IntList intList2 = IntLists.mutable.with(ints);
Assert.assertEquals(intList1, intList2);