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()
更改为takelong
,您将解决该特定问题
另一个问题是longestchain=chain
分配引用,而您需要复制内容。否则,下一次迭代将擦除longestchain
我不知道为什么内存不足,但我注意到代码中有一个错误-longestchain和chain指向同一个对象,所以当您清除chain时,您也会清除longestchain。您可以通过创建一个新数组来修复它,该数组包含链的内容,而不是赋值。谢谢,我没有注意到我犯了这个错误。