Java,内存不足,功能低效

Java,内存不足,功能低效,java,memory,Java,Memory,我正在写一个程序,这个程序应该可以创建数字链,并看到女巫一号是最长的。问题是我的内存不足,我不知道是什么消耗了我所有的内存。有人知道问题出在哪里吗 public static void main(String[] args) { ArrayList<Integer> longestchain; ArrayList<Integer> chain = new ArrayList<Integer>(); int size = 0;

我正在写一个程序,这个程序应该可以创建数字链,并看到女巫一号是最长的。问题是我的内存不足,我不知道是什么消耗了我所有的内存。有人知道问题出在哪里吗

public static void main(String[] args) {

    ArrayList<Integer> longestchain;
    ArrayList<Integer> chain = new ArrayList<Integer>();
    int size = 0;
    int longestsize = 0;
    int start;
    int number = 0;

        for(int i = 3; i < 1000000; i++)
        {
            start = i;
            chain.clear();
            chain.add(start);
            size = 1;
            while(true)
            {
                if(start == 1)
                {
                    break;
                }
                if(iseven(start))
                {
                    start = start / 2;
                }
                else
                {
                    start = start*3 + 1;
                }

                chain.add(start);
                size++;

            }

            if(size > longestsize)
            {
                longestsize = size;
                longestchain = chain;
                number = i;

            }
            //System.out.println(i);

        }
        System.out.println(number + ". " + longestsize);

}

public static boolean iseven(int n)
{
    return (n % 2 == 0);
}
publicstaticvoidmain(字符串[]args){
ArrayList最长链;
ArrayList链=新的ArrayList();
int size=0;
int longestsize=0;
int启动;
整数=0;
对于(int i=3;i<1000000;i++)
{
开始=i;
链。清除();
链。添加(开始);
尺寸=1;
while(true)
{
如果(开始==1)
{
打破
}
如果(iseven(启动))
{
开始=开始/2;
}
其他的
{
开始=开始*3+1;
}
链。添加(开始);
大小++;
}
如果(尺寸>最长尺寸)
{
最长尺寸=尺寸;
最长的链=链;
数字=i;
}
//系统输出打印LN(i);
}
系统输出打印项次(数字+“+”最长尺寸);
}
公共静态布尔值iseven(int n)
{
返回(n%2==0);
}

这可能不是解决方案,而是一个提示:

ArrayList的默认数组大小为10。将ArrayList初始化为更接近预期的值,或者许多数组创建都是在后台进行的:

// e.g.
ArrayList<Integer> chain = new ArrayList<Integer>(50000);
//例如。
ArrayList链=新ArrayList(50000);

问题是,当
i=113383
时,您会遇到整数溢出。
这会导致无限循环不断添加到
链中,直到堆空间用完。将
chain
longestchain
更改为
ArrayList
start
更改为
long
iseven()
更改为take
long
,您将解决该特定问题


另一个问题是
longestchain=chain
分配引用,而您需要复制内容。否则,下一次迭代将擦除
longestchain

我不知道为什么内存不足,但我注意到代码中有一个错误-longestchain和chain指向同一个对象,所以当您清除chain时,您也会清除longestchain。您可以通过创建一个新数组来修复它,该数组包含链的内容,而不是赋值。

谢谢,我没有注意到我犯了这个错误。