Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Arrays.asList()无法正常工作?_Java_Arrays_List_Variadic Functions - Fatal编程技术网

Java 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

我有一个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.asList(ints);
int[]ints=newint[]{1,2,3,4,5};
List=Arrays.asList(ints);
asList方法接受一个varargs参数,据我所知,它是数组的“速记”

问题:

  • 为什么第二段代码返回的是
    列表
    ,而不是
    列表

  • 有没有办法纠正它

  • 为什么自动装箱在这里不起作用;i、 e.
    int[]
    Integer[]


因为java数组是对象和数组。asList()将int数组视为varargs列表中的单个参数。

如何

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);