Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.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_Garbage Collection_Jvm - Fatal编程技术网

在Java中,条件之前的预分配是否会优化集合的内存?

在Java中,条件之前的预分配是否会优化集合的内存?,java,memory,garbage-collection,jvm,Java,Memory,Garbage Collection,Jvm,我一直在寻找我的问题,但到目前为止还没有找到确切的答案。 其实我在寻找简单的答案 假设我们有一个集合,我们不会预先分配它并使用它两次。一次用于条件语句,一次用于条件内部 if(!foo.getBooList().isEmpty()){ for(Boo boo : foo.getBooList()){ //... } } 第二种方法是 List<Boo> booList = foo.getBooList();

我一直在寻找我的问题,但到目前为止还没有找到确切的答案。 其实我在寻找简单的答案

假设我们有一个集合,我们不会预先分配它并使用它两次。一次用于条件语句,一次用于条件内部

    if(!foo.getBooList().isEmpty()){
        for(Boo boo : foo.getBooList()){
             //...
        }
     }
第二种方法是

List<Boo> booList = foo.getBooList();

    if(!booList.isEmpty()){
        for(Boo boo : booList){
        //..
        }
    }
List booList=foo.getBooList();
如果(!booList.isEmpty()){
for(Boo-Boo:booList){
//..
}
}
我也知道在模式方面,第二个更好,但我主要关注jvm在本例中关于内存的行为


提前谢谢

不会有任何区别。但是为了简单易读,只需删除if条件,这是无用的。可以对空集合进行迭代。循环永远不会执行。所以
if
是多余的。好的,谢谢。但我想提一提,;不仅是集合,而且每次对不同的对象调用get()方法都不会有什么区别,对吗?或者我们需要调用get()一次并将其分配给相应的对象引用,然后使用该引用?这取决于get()的作用。如果它只是返回一个字段(如getter通常所做的),那么它没有任何区别。如果它涉及一个最终返回某些内容的计算,那么每次调用该方法时都会进行计算。但无论如何,您应该努力提高可读性,而不是关注性能。调用传统的getter会消耗0内存和0 CPU。这不是导致性能问题的原因。不。首先,调用getter并不是初始化集合的目的。getter只返回对集合的引用,不管是否已初始化。初始化惰性集合的是对其任何方法(size()、isEmpty()、iterator()等)的调用。当然,只有对方法的第一次调用才能初始化集合。一旦它被初始化,它就被初始化了。它不会在每次调用方法时重新初始化。正如@JBNizet所说,它取决于
getBooList()
的功能。由于查看方法调用不会告诉你,我认为声明一个局部变量更可读,因为它会立即告诉读者,这是同一个集合。尽管如此,在这里,只为(Boo-Boo:foo.getBooList()){…}编写
,省略多余的
if
语句更具可读性,因为当集合为空时,集合上的循环已经没有任何作用。