Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
程序效率和java.lang.OutOfMemoryError:java堆空间_Java_Memory_Heap_Space_Out - Fatal编程技术网

程序效率和java.lang.OutOfMemoryError:java堆空间

程序效率和java.lang.OutOfMemoryError:java堆空间,java,memory,heap,space,out,Java,Memory,Heap,Space,Out,问题是每2个元素都要移除,直到最后一个元素保留。(假设图元放置在圆中) 我的程序可以很好地处理较小的n值,但当我使用较大的值时,它会给我一条java.lang.OutOfMemoryError:java堆空间消息 我需要做些什么才能使我的代码更有效率并解决这个错误 谢谢大家! import java.util.*; public class ArrayLists { public static void main(String[] args) { ArrayList m

问题是每2个元素都要移除,直到最后一个元素保留。(假设图元放置在圆中)

我的程序可以很好地处理较小的n值,但当我使用较大的值时,它会给我一条
java.lang.OutOfMemoryError:java堆空间
消息

我需要做些什么才能使我的代码更有效率并解决这个错误

谢谢大家!

import java.util.*;

public class ArrayLists {
    public static void main(String[] args) {
        ArrayList myList = new ArrayList();
        int n = 23987443;
        for (int i = 1; i <= n; i = i + 2) {
            myList.add("" + i);
        }

        Object x = myList.get(myList.size() - 1);
        Object y = myList.get(myList.size() - 1);
        while (myList.size() != 1) {
            if (x == y) {
                for (int i = 0; i <= myList.size() - 1; i++) {
                    myList.remove(i);
                }
            } 
            else {
                x = y;
                for (int i = 1; i <= myList.size() - 1; i++) {
                    myList.remove(i);
                }
            }
            y = myList.get(myList.size() - 1);
        }
        System.out.println("Winner:" + myList);
    }
}
import java.util.*;
公共类数组列表{
公共静态void main(字符串[]args){
ArrayList myList=新的ArrayList();
int n=23987443;

对于(int i=1;i您正在构建一个庞大的字符串列表。因此,您需要足够的内存来保存所有列表。您可以使用适当的大小初始化列表,避免临时复制以放大列表,从而减少消耗:

int n = 23987443;
List<String> myList = new ArrayList<String>(23987443);

例如(1024 MB的堆)

您正在构建一个庞大的字符串列表。因此,您需要足够的内存来保存所有列表。您可以通过使用适当的大小初始化列表,避免使用临时副本来扩大列表,从而减少消耗:

int n = 23987443;
List<String> myList = new ArrayList<String>(23987443);

例如(1024MB的堆)

这使用更少的内存,但速度要快一些,因为它是
O(N*logn)
而不是
O(N^2*logn)

publicstaticvoidmain(字符串[]args){
//对于(int n=1;n<400;n++){
int n=23987443;
系统输出打印(n+“:”);
结果(n);
// }
}
私有静态无效结果(int n){
List myList=new ArrayList(),myList2=new ArrayList();

对于(inti=1;i这使用更少的内存,但引用速度更快,因为它是
O(N*logn)
而不是
O(N^2*logn)

publicstaticvoidmain(字符串[]args){
//对于(int n=1;n<400;n++){
int n=23987443;
系统输出打印(n+“:”);
结果(n);
// }
}
私有静态无效结果(int n){
List myList=new ArrayList(),myList2=new ArrayList();

对于(int i=1;i问题的答案可以用封闭形式计算,如果您将列表中的元素数写为:

n=2^m+l


其中m是2的最大幂,因此可以用封闭形式计算问题的答案,因为如果将列表中的元素数写为:

n=2^m+l



其中m是2的最大幂,因此2^m你确定这个问题陈述是完整的“问题是删除第二个元素,直到最后一个元素保留。”?这与问题的答案无关,但当你知道列表包含字符串时,为什么要使用x和y作为对象?最明显的是不要使用字符串(将
“+i
更改为
i
)但除此之外,这到底是在做什么?!你能说出你的程序在做什么吗?我怀疑用另一种方法做会更有效。你确定这个问题陈述是完整的吗“问题是删除第二个元素,直到最后一个元素保留。”?这与问题的答案无关,但当您知道列表包含字符串时,为什么要使用x和y作为对象?最明显的是不要使用字符串(将
“”+i
更改为
i
)但除此之外,这到底是在做什么?!你能说出你的程序在做什么吗?我怀疑用另一种方式做会更有效率。我在我的程序中如何使用java-Xmx1024m以及我在哪里使用它(确切的语句)。了解它的任何链接都会非常感谢答案中的示例。-Xmx是一个JVM选项,在启动程序时传递给java可执行文件:
java-Xmx1024m-cp myjar.jar com.foo.bar.MyMainClass
。谢谢。我想知道我是否可以直接在程序中而不是在命令中更改堆大小哦,我明白了。谢谢你的帮助和分享你的知识:)我是如何在我的程序中使用java-Xmx1024m的,我在哪里使用它(以及确切的声明)。了解它的任何链接都会非常感谢答案中的示例。-Xmx是一个JVM选项,在启动程序时传递给java可执行文件:
java-Xmx1024m-cp myjar.jar com.foo.bar.MyMainClass
。谢谢。我想知道我是否可以直接在程序中而不是在命令中更改堆大小ne.哦,我明白了。谢谢你的帮助和分享你的知识:)有趣的是,当我将x和y作为int使用时,你将其指定为int,这是在抛出错误,告诉我“预期对象”你能解释一下原因和方法吗?感谢你在我将x和y作为int使用时,将其指定为int,这是在抛出错误,告诉我“预期对象”你能给我解释一下原因和方法吗?谢谢,答案完全正确!如果有更多像这样的链接,我可以用更数学的方式找到解决问题的方法,我将不胜感激。谢谢!但是我无法掌握逻辑,如果你能解释它与我的问题相关的话,那将非常有帮助。再次感谢。我想我有partially理解:Dell,我说我记得读过它,不是我自己理解的:),但是,对我来说,从n=1开始写例子总是有帮助的,类似于第10页书中所做的,猜测一个符合结果的封闭形式(例如(1.9))。还有用来建立循环的圆图(1.8)是非常有用的。证明封闭形式是用归纳法完成的,表明它与递归相同……我还可以推荐Udi Manber的《算法简介》一书,其中归纳法证明是一种设计程序的方法。谢谢分享Gregor Ophey:)愿你拥有更多的知识:D并继续分享:)答案是完全正确的!任何像这样的链接,在那里我可以找到一个更数学的方法,将非常感谢。谢谢!但是我无法掌握答案
public static void main(String[] args) {
    // for (int n = 1; n < 400; n++) {
    int n = 23987443;
    System.out.print(n + ": ");
    result(n);
    // }
}

private static void result(int n) {
    List<Integer> myList = new ArrayList<>(), myList2 = new ArrayList<>();
    for (int i = 1; i <= n; i = i + 2) {
        myList.add(i);
    }

    Integer x = myList.get(myList.size() - 1);
    Integer y = myList.get(myList.size() - 1);
    while (myList.size() != 1) {
        if (x == y) {
            for (int i = 1; i < myList.size(); i += 2) {
                myList2.add(myList.get(i));
            }
        } else {
            x = y;
            for (int i = 0; i <= myList.size() - 1; i += 2) {
                myList2.add(myList.get(i));
            }
        }
        List<Integer> tmp = myList2;
        myList2 = myList;
        myList = tmp;
        myList2.clear();

        y = myList.get(myList.size() - 1);
       // System.out.println("\t" + myList);
    }
    System.out.println("Winner:" + myList.get(0));
}
public class ArrayLists {
  public static void main(String[] args) {
    int n = 23987443;
    int pow = Integer.highestOneBit(n);
    int l = n - pow;
    System.out.println("Winner:[" +((2*l)+1)+"]" );
  }
}
Winner:[14420455]