Java 每种新版本与空版本的最佳实践
我有一个方法,每5秒迭代一个大数组。在每个循环中,我向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 =
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
可以为程序创建更多的工作。我是贝考