java 中的堆空间要求 - Arrays.sort() 与 Collections.sort()
HeapSpace requirement in java - Arrays.sort() vs Collections.sort()
我写了一个方法来对 arrayList 进行排序,它们交换 arrayList 中的连续元素。我遇到了一个问题 -
如果我使用 Collections.sort() 实现该方法,它会给出堆大小错误,而如果我使用 Arrays.sort() 它不会,并且 运行 成功。
public ArrayList<Integer> sortAndSwap(ArrayList<Integer> a) {
Collections.sort(a);
for(int i = 0; i < a.size()-1; i+=2) {
int temp = a.get(i);
a.add(i, a.get(i+1));
a.add(i+1, temp);
}
return a;
}
此方法给出以下错误 -
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:3210) at
java.util.Arrays.copyOf(Arrays.java:3181) at
java.util.ArrayList.grow(ArrayList.java:261) at
java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:235) at
java.util.ArrayList.ensureCapacityInternal(ArrayList.java:227) at
java.util.ArrayList.add(ArrayList.java:475) at
Solution.wave(Solution.java:7) at Main.main(Main.java:322)
而如果我修改如下
public ArrayList<Integer> sortAndSwap(ArrayList<Integer> a) {
Integer []arr = new Integer[a.size()];
a.toArray(arr);
Arrays.sort(arr);
for(int i = 0; i < a.size()-1; i+=2) {
int temp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = temp;
}
a = new ArrayList<Integer>(Arrays.asList(arr));
return a;
}
它 运行 很好并且给出了预期的结果。
为什么会这样,谁能解释一下?谢谢!
对于交换操作,您在应该使用 set
时调用 add
。
所以你在无休止地增加列表。
我写了一个方法来对 arrayList 进行排序,它们交换 arrayList 中的连续元素。我遇到了一个问题 -
如果我使用 Collections.sort() 实现该方法,它会给出堆大小错误,而如果我使用 Arrays.sort() 它不会,并且 运行 成功。
public ArrayList<Integer> sortAndSwap(ArrayList<Integer> a) {
Collections.sort(a);
for(int i = 0; i < a.size()-1; i+=2) {
int temp = a.get(i);
a.add(i, a.get(i+1));
a.add(i+1, temp);
}
return a;
}
此方法给出以下错误 -
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOf(Arrays.java:3210) at java.util.Arrays.copyOf(Arrays.java:3181) at java.util.ArrayList.grow(ArrayList.java:261) at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:235) at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:227) at java.util.ArrayList.add(ArrayList.java:475) at Solution.wave(Solution.java:7) at Main.main(Main.java:322)
而如果我修改如下
public ArrayList<Integer> sortAndSwap(ArrayList<Integer> a) {
Integer []arr = new Integer[a.size()];
a.toArray(arr);
Arrays.sort(arr);
for(int i = 0; i < a.size()-1; i+=2) {
int temp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = temp;
}
a = new ArrayList<Integer>(Arrays.asList(arr));
return a;
}
它 运行 很好并且给出了预期的结果。 为什么会这样,谁能解释一下?谢谢!
对于交换操作,您在应该使用 set
时调用 add
。
所以你在无休止地增加列表。