Java - 如何在数组中存储大量值

时间:2016-03-19 11:05:02

标签: java arrays memory runtime

你好伙伴Stackoverflowers。我一直在玩java中的数组,我一直在尝试在数组中存储大量的值。但是,我无法在数组中存储超过一定数量的值:

String data[] = new String[44681003]; //由于某种原因,44681003是我可以访问的最高数字,直到它通过控制台发出一条丑陋的红色错误消息:

  

线程“main”中的异常java.lang.OutOfMemoryError:Java堆空间

我有一个程序可以生成给定字符串列表的所有排列,并且它完美地工作,直到我必须生成一个大于那个奇怪的44680815数字的数字。 (例如:387420489,即9 ^ 9)

我已经尝试存储该值并在for循环中将其打印到控制台,将值设置回null data[i] = null;

我只是想知道是否有办法在数组中存储大量值?

能够简单地打印出我的值,然后将其从存储在数组中删除。

这是我的代码:

public class Permutations {

public static void main(String[] args) {
    String database = "abcdefghi";

//  String data[] = new String[(int) Math.pow(database.length(), database.length())];
// ^^ I would like to make it this long, but It gives an error.

    String data[] = new String[44681003];
    StringBuilder temp;


    for (int i = 0;i<Math.pow(database.length(), database.length());i++){
        String base = Integer.toString(i,database.length());
        data[i] = base;
        if (base.length()!=database.length()){
             temp = new StringBuilder(""); 
            for (int x = 0;x < (database.length()-data[i].length());x++){
                temp.append('0');
            }
            base = temp + base;

        }

        for (int y = 0;y<database.length();y++){
            base = base.replace((char)('0' + y), database.charAt(y));
        }

        data[i]=null;

        System.out.println("Pos: " + i + "     " + base); //<-- USE THIS TO WRITE IT OUT
    }//end big for loop
    System.out.println("Done");



    }

}

控制台中的最后一行:

Pos: 44680997     badagahcc
Pos: 44680998     badagahcd
Pos: 44680999     badagahce
Pos: 44681000     badagahcf
Pos: 44681001     badagahcg
Pos: 44681002     badagahch
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 44681003
at Permutations.main(Permutations.java:20)
  

我的电脑规格:   http://store.asus.com/us/item/201510AM160007799/A17602

  • Windows 10
  • 英特尔酷睿i7 4720HQ 2.6GHz(Turbo高达3.6GHz)
  • 16GB内存
  • 1TB HDD
  • NVIDIA GeForce GTX 970M 3GB
  • 17.3英寸IPS FHD(1920 x 1080)支持G-Sync

感谢您的时间!我希望我能找到一个解决方案,也许可以帮助其他人有相同/类似的问题!

1 个答案:

答案 0 :(得分:3)

如果您收到OutOfMemoryError,您的程序需要更多内存来执行您要求它执行的操作

但是,由于您没有保留存储在数组中的任何字符串,例如

data[i] = null;

我建议你删除阵列,因为你不需要它。这将解决你的记忆问题。

您可以将代码转换为函数,这样即使您以后需要随机访问也无需构建数组。

是的,你得到N!来自一组N的排列,因为你不能重复任何字母。例如badagahcc不是排列,因为它有a 3次,c两次。

public static String generate(String letters, long number) {
    // get a list of the all the possible characters assuming no duplicates.
    List<Character> chars = new ArrayList<>(letters.length());
    for (int i = 0; i < letters.length(); i++)
        chars.add(letters.charAt(i));
    // start with a string builder.
    StringBuilder ret = new StringBuilder(letters.length());

    // while we have characters left
    while(chars.length() > 0) {
       // select one of the unused characters
       int select = number % chars.length();
       // take out the lower portion of the number and use the next portion
       number /= chars.length();
       // Append the N-th character, but remove it so it doesn't get used again.
       ret.append(chars.remove(select));
    }
    assert number == 0; // otherwise we have not enough letters.
    return ret;
}

这样你就可以在没有记忆的情况下得到任何排列。