声明与空检查时的Java集合初始化
初始化Java集合(例如,在声明时初始化ArrayList)是否有任何主要缺点,例如:声明与空检查时的Java集合初始化,java,performance,collections,Java,Performance,Collections,初始化Java集合(例如,在声明时初始化ArrayList)是否有任何主要缺点,例如: List<String> strList = new ArrayList<String>(); List strList=new ArrayList(); 主要目的是在检索元素时避免空检查的混乱 谢谢一般来说,唯一的缺点是你最终可能会发现一大堆收藏什么都不做,并且不必要地做了创建收藏的工作 我个人的偏好是总是分配一个有效的集合,除非有明确的理由避免内存和初始化开销,例如循环内和其他
List<String> strList = new ArrayList<String>();
List strList=new ArrayList();
主要目的是在检索元素时避免空检查的混乱
谢谢一般来说,唯一的缺点是你最终可能会发现一大堆收藏什么都不做,并且不必要地做了创建收藏的工作 我个人的偏好是总是分配一个有效的集合,除非有明确的理由避免内存和初始化开销,例如循环内和其他可能的性能考虑。如果我总是确保对象被初始化为非null,那么在使用集合之前,我不会执行冗余的null检查
我要补充的警告是,如果您确实使用了该集合,请确保您使用了该集合,并且在以后的代码中,不要将其替换为一个全新的集合(这将表明可能存在设计缺陷)。要强制执行此操作,您可以将集合声明为final。一般来说,唯一的缺点是,您可能会看到一大堆集合什么也不做,并且不必要地完成了创建集合的工作 我个人的偏好是总是分配一个有效的集合,除非有明确的理由避免内存和初始化开销,例如循环内和其他可能的性能考虑。如果我总是确保对象被初始化为非null,那么在使用集合之前,我不会执行冗余的null检查
我要补充的警告是,如果您确实使用了该集合,请确保您使用了该集合,并且在以后的代码中,不要将其替换为一个全新的集合(这将表明可能存在设计缺陷)。要强制执行此操作,您可以将集合声明为final。您几乎应该立即初始化。只是因为它已经初始化,并不意味着你不应该再做空检查了。创建对象和if检查对性能几乎没有影响。只有在创建一个必须从其他集合或数组复制对象的列表时,才应该几乎总是立即初始化。只是因为它已经初始化,并不意味着你不应该再做空检查了。创建对象和if检查对性能几乎没有影响。仅当您创建一个必须从其他集合或数组复制对象的列表时,它取决于用例:
- 方法主体声明-始终正常
- 静态字段声明-应始终正常
- 字段声明。有两种常见的情况—您总是需要初始化它,或者它可能是
。在第一种情况下,我将其设置为final,并且更喜欢在构造函数中初始化。如果它可能是null
,我会添加一个惰性getter,并用null
对其进行如下注释:@Nullable
@Nullable
列表strList;
...
公共最终列表getList(){
if(strList==null){
strList=newarraylist();
}
返回strList;
}
此技术帮助我消除字段状态的模糊性。这取决于用例:
- 方法主体声明-始终正常
- 静态字段声明-应始终正常
- 字段声明。有两种常见的情况—您总是需要初始化它,或者它可能是
。在第一种情况下,我将其设置为final,并且更喜欢在构造函数中初始化。如果它可能是null
,我会添加一个惰性getter,并用null
对其进行如下注释:@Nullable
@Nullable
列表strList;
...
公共最终列表getList(){
if(strList==null){
strList=newarraylist();
}
返回strList;
}
这项技术有助于消除字段状态的模糊性。有关此情况的更多信息将非常有用。您将此声明与什么进行比较?此声明的性能比…?任何关于ArrayList的asnwer都可以标记为此问题的答案。更清楚一点。关于情况的更多信息将是有用的。您将此声明与什么进行比较?此声明的性能比…?任何关于ArrayList的asnwer都可以标记为此问题的答案。更清楚一点。如果集合引用从未被重新分配,我也会声明它为final。那么你就知道它是初始化的,并且从不为null。这很有意义。如果集合引用从未被重新分配,我也会声明它为final。然后你就知道它是初始化的,并且从不为空。这很有道理。这个建议不可扩展。创建“一个”对象对性能没有实质性影响;在一个紧循环中创建一百万个对象不仅会增加分配和初始化,而且会增加GC的额外负载。这个建议不会扩展。创建“一个”对象对性能没有实质性影响;在一个紧密循环中创建一百万个对象将不仅用于分配和初始化,而且会增加GC的额外负载。
@Nullable
List<String> strList;
...
public final List getList(){
if(strList == null){
strList = new ArrayList();
}
return strList;
}