Java性能:清除对象时最好设置为null或创建新对象.

Bra*_*ain 5 java performance null object new-operator

重复使用对象时,通过将数据设置为null或实例化新对象来清除数据是否更好?

   Object a = new Object();
   for(...){
       ...
       a = null;
       **OR**
       a = new Object();
    }
Run Code Online (Sandbox Code Playgroud)

这是我所指的例子:

Customer a = new Customer();
Collection<Customer> data = new ArrayList<Customer>();

        while (rs != null && rs.next()) {   
            a = new Customer();
            a.setCustId(rs.getLong("CUST_ID"));
            a.setPerNo(period);
            a.setName(rs.getString("cust_nm"));

            if(a!= null)
                data.add(a);
        }
Run Code Online (Sandbox Code Playgroud)

我想知道是否

a = new Customer();
Run Code Online (Sandbox Code Playgroud)

这是实现这一目标的最佳方式,或者是否应以不同方式进行以节省内存和获得最佳性能,因为每个循环都有新的客户信息.根据我的理解,如果您创建新客户,则需要创建新客户对象并指向该新对象.因此,指向的旧对象将被垃圾收集器拾取 - 在将其设置为null的情况下也是如此.这是正确的理解吗?

Jon*_*eet 14

我会比较喜欢:

for (...) {
    Object a = new Object();
    ...
}
Run Code Online (Sandbox Code Playgroud)

为什么要使范围大于它需要的范围?

同样,除非我需要一个新对象,否则我不会为它创建一个.

虽然只是给出了描述,但很难说更多 - 如果你能提供一个更完整和真实的例子,我们可以提出更具体的建议.

(注意,没有迹象表明你想要反复使用一个对象,就像重复使用一个变量一样.它们是非常不同的概念.)

编辑:看看你的具体例子,我会这样写:

Collection<Customer> data = new ArrayList<Customer>();

while (rs != null && rs.next()) {   
    Customer a = new Customer();
    a.setCustId(rs.getLong("CUST_ID"));
    a.setPerNo(period);
    a.setName(rs.getString("cust_nm"));

    data.add(a);
}
Run Code Online (Sandbox Code Playgroud)

请注意,这不会创建任何 Customer符合垃圾收集条件的对象 - 而原始代码会Customer在进入循环之前创建一个实例,然后忽略新创建的对象,而是创建一个新对象并重新分配a值.


Rya*_*art 6

实例化您需要它们的对象.不要你不在的地方.在分析器告诉您之前,不要担心这种级别的优化.

编辑:鉴于您更新的答案,读者可以更清楚地声明变量并在循环中实例化您的Customer对象,如Jon建议的那样.至于您的性能和垃圾收集问题,您需要提高对基本语言概念的掌握.