简体   繁体   English

Java中的HeapSpace要求-Arrays.sort()与Collections.sort()

[英]HeapSpace requirement in java - Arrays.sort() vs Collections.sort()

I have written a method which sorts the arrayList and them swaps the consecutive elements in that arrayList. 我已经编写了一种对arrayList进行排序的方法,它们交换该arrayList中的连续元素。 I am facing a issue - 我面临一个问题-

If I implement the method by using Collections.sort() it gives heapsize error while if I use Arrays.sort() it does not and run successfully. 如果我使用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;
    }

this method gives the below error - 此方法出现以下错误-

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) 线程“主”中的异常java.lang.OutOfMemoryError:java.util.Arrays.copyOf(Arrays.java:3181)处的java.util.Arrays.copyOf(Arrays.java:3210)处的Java堆空间。 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)在Main.main(Main.java:322)的Solution.wave(Solution.java:7)

while if i modify it as follows 而如果我如下修改

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

It runs fine and gives desired results. 它运行良好,并提供所需的结果。 Why is this happening, can anybody explain ? 为什么会这样,有人可以解释吗? Thanks ! 谢谢 !

For the swap operation you call add when you should use set . 对于交换操作,应在使用set时调用add So you are increasing the list endlessly. 因此,您正在不断增加清单。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM