ste*_*_72 8 java arrays collections list
我有以下Java代码:
import java.util.Arrays;
import java.util.Collections;
public class Test {
public static void main(String[] args) {
int[] test = {1,2,3,4,5};
Collections.rotate(Arrays.asList(test), -1);
for(int i = 0; i < test.length; i++) { System.out.println(test[i]); }
}
}
Run Code Online (Sandbox Code Playgroud)
我想要旋转数组,但我得到的输出是
1
2
3
4
5
Run Code Online (Sandbox Code Playgroud)
为什么是这样?
还有替代解决方案吗?
编辑:
这样可行:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Test {
public static void main(String[] args) {
int[] test = {1,2,3,4,5};
List<Integer> testList = new ArrayList<Integer>();
for(int i = 0; i < test.length; i++) { testList.add(test[i]); }
Collections.rotate(testList, -1);
for(int i = 0; i < test.length; i++) { System.out.println(testList.get(i)); }
}
}
Run Code Online (Sandbox Code Playgroud)
但是Arrays.asList应该返回一个列表,当写入时,将更改复制到数组.有没有办法解决这个问题,而无需手动进行从数组到列表的转换?
我(认为我)不能浪费那么多CPU时间和内存来进行转换.
pol*_*nts 21
这是一个棘手的问题:是的,asList支持List它返回数组,并更改为List将"直写"到数组.但是,由于T...在这种情况下varargs如何与基本类型的数组进行交互,实际上你创建了一个包含1个元素的列表!
int[] test = {1,2,3,4,5};
System.out.println(Arrays.asList(test).size());
// prints "1"
Run Code Online (Sandbox Code Playgroud)
让我们尝试不同的东西:
int[] test = {1,2,3,4,5};
List<Integer> list = Arrays.asList(test);
// "Type mismatch: cannot convert from List<int[]> to List<Integer>"
Run Code Online (Sandbox Code Playgroud)
如您所见,带有a的varargs int[]无法按预期方式工作,编译器会出错.Arrays.asList实际上返回1元素List<int[]>而不是5元素List<Integer>.
使用Integer[]而不是int[]按预期工作:
Integer[] test = {1,2,3,4,5};
Collections.rotate(Arrays.asList(test), -1);
System.out.println(Arrays.toString(test));
// prints "[2, 3, 4, 5, 1]"
Run Code Online (Sandbox Code Playgroud)
完整的签名asList是<T> List<T> Arrays.asList(T... a).请注意,在这种情况下T不能int出于同样的原因,因为您不能拥有List<int>Java:T需要是引用类型.
请考虑以下代码段:
System.out.println(Arrays.asList(1,2,3));
// prints "[1, 2, 3]"
Run Code Online (Sandbox Code Playgroud)
这里发生的是每个都int被装入一个Integer,并且varargs机制"工作"并asList创建一个包含3个元素的列表.现在考虑以下形式:
System.out.println(Arrays.asList(new int[] { 1,2,3 }));
// prints "[[I@xxxxxx]"
Run Code Online (Sandbox Code Playgroud)
现在的争论asList是一个int[].T不能是一个int,因此,T...可变参数机制"失败",并且asList只得到一个元素,它是一个int[],而不是int值本身.
现在考虑这个形式:
System.out.println(Arrays.asList(new Integer[] { 1,2,3 }));
// prints "[1, 2, 3]"
Run Code Online (Sandbox Code Playgroud)
现在既然Integer[]是a T...,asList按预期得到3个元素.
int[]不会自动装箱到Integer[]