在解决1-N最多约数问题时,用筛选法求解质数数列时,
需设置标志数组,byte [] flag = new byte[500000000],
但编译器报错,推展超出范围啦,我尝试更改参数,将堆栈扩大到800m,但仍然错误,而且机子很卡1,java 超大数组如何实现?2,那个标志法可不可用Bit 标识,类似一张位图,这样占用的空间会小 很多阿,java中有操作方法嘛?

解决方案 »

  1.   

    这种问题我觉得不是你用哪个java对象的问题,而是你应该自己设计数据结构,类似于大数运算-
    比如1000000000000000000000000*10000000000000000000000000000,这个连编译都通不过。
    你必须自己用字符串代替数值,然后自己写逢十进一的算法得出一个更大的字符串。
      

  2.   

    list同样会挂,毕竟内存是有限的
      

  3.   

    可以使用bit操作,但是要自己去计算了
      

  4.   

    5亿?
    用bitmap也要大概
    500000000/8/1024/1024mb的内存
    占用已经相当多了
    估计还是程序实现有问题
    bitmap在java里面对应的是java.util.BitSet
    但是需要高版本的jdk支持
      

  5.   

    那有谁知道java数组最多能放多少各元素阿?
      

  6.   

    理论上数组大小是一个32位int型,但实际上还要看分配给jvm的内存的
      

  7.   

    现所有容器应该不支持这么大的东西, 你可以改改算法,把他包装成一个类,  类中用多维数据来实现,
                 
       class ByteFlag(){
            private byte[][] byteFlag=new byte[1000][500000];
            public byte getValue(int index){
                   return byteFlag[index/500000][index%500000];
            }
            public void setValue(int index,byte flag){
               byteFlag[index/500000][index%500000]=flag;
            }
       }
      

  8.   

    也就500mb内存, 放心能搞定,哈哈,不过你要想弄500mb的连续内存可能会有问题二维数组是非连续的,
      

  9.   

    500000000 个元素 * 4字节每个整数 / (1024*1024)M 已经接近2G了,怎么可能只有500M内存