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

时间:2011-07-28 15:01:36

标签: java performance object null new-operator

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

   Object a = new Object();
   for(...){
       ...
       a = null;
       **OR**
       a = new Object();
    }

以下是我所指的例子:

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);
        }

我想知道是否

a = new Customer();

是执行此操作的最佳方式,或者是否应采用不同的方式来节省内存并获得最佳性能,因为每个循环都有新的客户信息。根据我的理解,如果您创建新客户,那么您就是创建一个新对象并指向该新对象。因此,指向的旧对象将被垃圾收集器拾取 - 在将其设置为null的情况下也是如此。这是正确的理解吗?

4 个答案:

答案 0 :(得分:14)

我更愿意:

for (...) {
    Object a = new Object();
    ...
}

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

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

很难从描述中得到更多的说明 - 如果你能提供一个更完整和真实的例子,我们可以提出更具体的建议。

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

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

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);
}

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

答案 1 :(得分:6)

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

编辑:鉴于您更新的答案,读者可以更清楚地声明变量并在循环中实例化您的Customer对象,如Jon建议的那样。至于您的性能和垃圾回收问题,您需要improve your grasp of the basic language concepts

答案 2 :(得分:1)

对于明确要“停止”引用对象的特殊情况,需要明确地使用NULL引用,否则将导致实际的内存泄漏。作为示例,您可以查看数组支持的List实现,其中NULL数组槽以避免指向不再使用的引用/对象。

答案 3 :(得分:1)

我认为您的困惑来自于不了解对象是通过引用传递的。如果您来自C背景,请了解在Java中,Customer a = new Customer();实际上会执行类似

的操作
Customer* a = (Customer*) malloc (sizeof(Customer));
initializeCustomer (a); //the constructor initializes the state of the object.

由于您实际上需要为添加到列表中的每个客户提供新内存,因此无法避免为循环的每次迭代创建新的Customer对象。