Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.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 每种新版本与空版本的最佳实践_Java_Memory Management_Arraylist - Fatal编程技术网

Java 每种新版本与空版本的最佳实践

Java 每种新版本与空版本的最佳实践,java,memory-management,arraylist,Java,Memory Management,Arraylist,我有一个方法,每5秒迭代一个大数组。在每个循环中,我向ArrayList添加一些内容 private ArrayList<MyMarker> myArray; public void callEveryFiveSeconds(){ myArray = new ArrayList<MyMarker>(); //clears previous array data //grab array data from server for (int i =

我有一个方法,每5秒迭代一个大数组。在每个循环中,我向
ArrayList
添加一些内容

private ArrayList<MyMarker> myArray;

public void callEveryFiveSeconds(){
    myArray = new ArrayList<MyMarker>(); //clears previous array data
    //grab array data from server
    for (int i = 0; i < 200; i++) {
       myArray.add(someData);
    }
}
我听说使用
new
会占用更多内存

我需要知道清空/清除上面的
ArrayList
的最佳方法是什么

private ArrayList<MyMarker> myArray;

public void callEveryFiveSeconds(){
    myArray = new ArrayList<MyMarker>(); //clears previous array data
    //grab array data from server
    for (int i = 0; i < 200; i++) {
       myArray.add(someData);
    }
}
private ArrayList myArray;
public void callEveryFiveSeconds(){
myArray=new ArrayList();//清除以前的数组数据
//从服务器获取阵列数据
对于(int i=0;i<200;i++){
添加(someData);
}
}

private ArrayList myArray=new ArrayList();
public void callEveryFiveSeconds(){
myArray=null;//清除以前的数组数据
//从服务器获取阵列数据
对于(int i=0;i<200;i++){
添加(someData);
}
}

第二个代码错误,将引发NullPointerException

如果要清除列表,请执行以下操作:

public void callEveryFiveSeconds(){
    myArray.clear();
    //grab array data from server
    for (int i = 0; i < 200; i++) {
       myArray.add(someData);
    }
}
public void callEveryFiveSeconds(){
myArray.clear();
//从服务器获取阵列数据
对于(int i=0;i<200;i++){
添加(someData);
}
}
至于哪个选项更好—创建新的
ArrayList
实例或清除现有实例—后者应该占用更少的内存,因为它不必为新的
ArrayList
分配新的数组。前者将使用新数组分配一个新的
ArrayList
,而旧的
ArrayList
将有资格进行垃圾收集。这意味着第二个选项(清除列表)将为垃圾收集器节省工作,这也是一件性能方面的好事


如果每次调用
callEveryFiveSeconds
时添加到列表中的元素数量保持相似,则清除现有列表而不是每次创建新列表还有另一个好处。这是因为在不指定初始容量的情况下创建一个新的
ArrayList
会创建一个初始容量较小的列表,如果向新列表中添加许多元素,则必须多次调整其大小,这也会耗费时间。

第二个代码错误,并将引发NullPointerException

如果要清除列表,请执行以下操作:

public void callEveryFiveSeconds(){
    myArray.clear();
    //grab array data from server
    for (int i = 0; i < 200; i++) {
       myArray.add(someData);
    }
}
public void callEveryFiveSeconds(){
myArray.clear();
//从服务器获取阵列数据
对于(int i=0;i<200;i++){
添加(someData);
}
}
至于哪个选项更好—创建新的
ArrayList
实例或清除现有实例—后者应该占用更少的内存,因为它不必为新的
ArrayList
分配新的数组。前者将使用新数组分配一个新的
ArrayList
,而旧的
ArrayList
将有资格进行垃圾收集。这意味着第二个选项(清除列表)将为垃圾收集器节省工作,这也是一件性能方面的好事


如果每次调用
callEveryFiveSeconds
时添加到列表中的元素数量保持相似,则清除现有列表而不是每次创建新列表还有另一个好处。原因是,在不指定初始容量的情况下创建一个新的
ArrayList
会创建一个初始容量较小的列表,如果向新列表中添加许多元素,则必须多次调整其大小,这也会耗费时间。

有一个名为clear()的方法可以清空ArrayList:

public void callEveryFiveSeconds(){
    myArray.clear();
    //grab array data from server
    for (int i = 0; i < 200; i++) {
       myArray.add(someData);
    }
}
public void callEveryFiveSeconds(){
myArray.clear();
//从服务器获取阵列数据
对于(int i=0;i<200;i++){
添加(someData);
}
}

有一个名为clear()的方法可以清空arraylist:

public void callEveryFiveSeconds(){
    myArray.clear();
    //grab array data from server
    for (int i = 0; i < 200; i++) {
       myArray.add(someData);
    }
}
public void callEveryFiveSeconds(){
myArray.clear();
//从服务器获取阵列数据
对于(int i=0;i<200;i++){
添加(someData);
}
}

你所做的就是所谓的过早优化。如果您每5秒只调用一次方法,那么您应该正常编写代码,而不考虑微观优化。如果您的程序在现代处理器上运行,那么它将能够在每个方法调用之间执行数百亿条指令。优化这一方法不会对程序的性能产生总体影响。内存方面,您的数组列表似乎只有200项。在64位操作系统上,您的阵列列表将需要少于2kB的内存来容纳所有所需的内存资源。当现代计算机有千兆字节的可用内存时,事情的宏伟蓝图中也没有多少内容

实际上,与创建新的
ArrayList
相比,使用
ArrayList.clear
可以为程序创建更多的工作。这是因为通过清除
ArrayList
程序必须将备份数组中的每个项设置为
null
。但是,Java的垃圾收集器非常高效,当它处理未使用的
ArrayList
时,它能够在不清除备份数组的情况下处理它

考虑到我的计算机上的以下微型基准测试,每个测试都会运行一千万次:

public static final Object OBJ = new Object();
public static final int LENGTH = 200;

public static ArrayList<Object> clearArrayList(ArrayList<Object> objects) {
    objects.clear();
    for (int i = 0; i < LENGTH; i++) {
        objects.add(OBJ);
    }
    return objects;
}

public static ArrayList<Object> newArrayList() {
    ArrayList<Object> objects = new ArrayList<Object>(LENGTH);
    for (int i = 0; i < LENGTH; i++) {
        objects.add(OBJ);
    }
    return objects;
}

你所做的就是所谓的过早优化。如果您每5秒只调用一次方法,那么您应该正常编写代码,而不考虑微观优化。如果您的程序在现代处理器上运行,那么它将能够在每个方法调用之间执行数百亿条指令。优化这一方法不会对程序的性能产生总体影响。内存方面,您的数组列表似乎只有200项。在64位操作系统上,您的阵列列表将需要少于2kB的内存来容纳所有所需的内存资源。当现代计算机有千兆字节的可用内存时,事情的宏伟蓝图中也没有多少内容

实际上,与创建新的
ArrayList
相比,使用
ArrayList.clear
可以为程序创建更多的工作。我是贝考