当前位置: 代码迷 >> J2SE >> 关于数组逆转的有关问题:当数组非常大的时候
  详细解决方案

关于数组逆转的有关问题:当数组非常大的时候

热度:3678   发布时间:2013-02-25 00:00:00.0
关于数组逆转的问题:当数组非常大的时候。
Java code
package com.yaxing.suanfa;public class ArrayDemo {        /**     * 改变了数组     * */    public static int[] reverseArray(int[] a){        int temp;        for(int i=0;i<a.length/2;i++){            temp = a[i];            a[i] = a[a.length-1-i];            a[a.length-1-i] = temp;        }        return a;    }        public static char[] reverseArray(char[] a){        char temp;        for(int i=0;i<a.length/2;i++){            temp = a[i];            a[i] = a[a.length-1-i];            a[a.length-1-i] = temp;        }        return a;    }    /**     * 使用泛型     * */    public Object[] reverseArray1(Object[] a){        Object temp;        for(int i=0;i<a.length/2;i++){            temp = a[i];            a[i] = a[a.length-1-i];            a[a.length-1-i] = temp;        }        return a;    }    /**     * 逆序输出,不逆转数组     * */    public static int[] reverseArrayPrint(int[] a){                 for(int i=0;i<a.length;i++){            if(i==a[a.length-1]){                System.out.print(a[a.length-1-i]+" ");            }else{                System.out.print(a[a.length-1-i]+"、");            }        }        return a;    }    /**     * @param args     */    public static void main(String[] args) {        int a[] = new int[100];        for(int i=0;i<a.length;i++){            a[i]=i;        }        System.out.println("原始数组:");        for(int i:a){            if(i==a[a.length-1]){                System.out.print(i+" ");            }else{                System.out.print(i+"、");            }        }        System.out.println();        int b[] = ArrayDemo.reverseArray(a);        System.out.println("逆转后数组:");        for(int i:b){            if(i==b[b.length-1]){                System.out.print(i+" ");            }else{                System.out.print(i+"、");            }        }        System.out.println();        System.out.println("只逆序打印数组");        ArrayDemo.reverseArrayPrint(a);        String cc = "abcdefg";        char c[] = cc.toCharArray();;        ArrayDemo.reverseArray(c);        System.out.println();        System.out.println("逆序字符串");        for(char i:c){            if(i==c[c.length-1]){                System.out.print(i+" ");            }else{                System.out.print(i+"、");            }        }    }}

思路就是:第一个跟最后一个换,第二个跟倒数第二个换。。。依次类推。

但是,当数组非常大的时候,
就会报如下异常:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

另外,我想把这个改成泛型的,该怎么改呢,就是不管我下面定义的是什么类型的数组,上面都可以处理,
而不用重载好多个reverseArray()方法啊。

------解决方案--------------------------------------------------------
分成多个数组来逆转,况且这个是否OutOfMemoryError跟你的JVM设置有关的,如果数组过大可能会直接进入老年代,这个时候如果你的老年代大小不够,那肯定要报内存溢出的。
至于泛型的话,建议你看看ArrayList的实现嘛,你应该能从中学到一些你想要的东西
------解决方案--------------------------------------------------------
OutOfMemoryError 这个是内存溢出 和你数组没关系的,设置一下就可以。
------解决方案--------------------------------------------------------
能用sun的api尽量别自己写方法。
java.util 
类 Collections

reverse
public static void reverse(List<?> list)反转指定列表中元素的顺序。
此方法以线性时间运行。 


参数:
list - 元素要被反转的列表。 
抛出: 
UnsupportedOperationException - 如果指定列表或其列表迭代器不支持 set 操作。
  相关解决方案