我有以下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]); }
}
}
我想要旋转数组,但我得到的输出是
1
2
3
4
5
为什么会这样?
还有替代解决方案吗?
编辑:
这样可行:
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)); }
}
}
但是Arrays.asList应该返回一个列表,当写入时,将更改复制到数组。有没有办法解决这个问题而无需手动进行从数组到列表的转换?
我(认为我)不能浪费那么多CPU时间和内存来进行转换。
答案 0 :(得分:19)
这是一个棘手的问题:是的,asList
支持它返回的数组List
,而List
的更改将“直写”到数组。但是,由于T...
的varargs在这种情况下如何与基本类型的数组交互,实际上您实际上是在创建一个包含1个元素的列表!
int[] test = {1,2,3,4,5};
System.out.println(Arrays.asList(test).size());
// prints "1"
让我们尝试不同的东西:
int[] test = {1,2,3,4,5};
List<Integer> list = Arrays.asList(test);
// "Type mismatch: cannot convert from List<int[]> to List<Integer>"
如您所见,带有int[]
的varargs无法按预期方式工作,编译器会出错。 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]"
asList
的完整签名是<T> List<T> Arrays.asList(T... a)
。请注意,T
在这种情况下不能是int
,原因与您在Java中不能拥有List<int>
的原因相同:T
需要是引用类型
请考虑以下代码段:
System.out.println(Arrays.asList(1,2,3));
// prints "[1, 2, 3]"
这里发生的是每个int
被装入Integer
,varargs机制“有效”,asList
创建一个包含3个元素的列表。现在考虑以下形式:
System.out.println(Arrays.asList(new int[] { 1,2,3 }));
// prints "[[I@xxxxxx]"
现在asList
的参数是int[]
。 T
不能是int
,因此T...
varargs机制“失败”,而asList
只获得一个元素,而且它是int[]
,而不是int
值本身。
现在考虑这种形式:
System.out.println(Arrays.asList(new Integer[] { 1,2,3 }));
// prints "[1, 2, 3]"
既然Integer[]
是T...
,asList
会按预期获得3个元素。
int[]
不会自动装箱到Integer[]