创建新对象或重用旧对象Java

时间:2014-06-28 07:23:12

标签: java oop

我有一个“按钮”的HashMap,可以用按键点击按钮的位置(x和y坐标)。每次从数据库接收到新数据时,按钮都会自行重新排列并更新它们在地图中的位置以及与“按钮”对象相关联的其他值。目前我将按钮作为不可变对象,因此每次收到新数据时都需要创建新按钮。

当我想到一个现实生活中的例子(购买一个新的,不同颜色版本的房子而不是画你已经拥有的那个)时,继续创建物品而不是仅仅重复使用旧物体似乎有点浪费,这是最好的方法吗?

1 个答案:

答案 0 :(得分:1)

创建新对象通常意味着分配新内存,这是一项非常昂贵的操作,如果函数确实需要优化,应该避免这种情况。

在没有任何代码的情况下,在特定情况下创建新对象是否会更快(如果不是不可能)。如果我们谈论10个按钮的列表并不重要,但如果我们谈论按钮上的数万亿列表,你应该尝试重新分配它们的值。

下面是一个小例子,说明了创建新对象和重新分配实例的单个值之间的区别,如果我理解你正确提问它应该与你的情况有些相似。我的机器上的输出可以在下面看到。

package org.stackoverflow;

import java.util.ArrayList;

public class Example {

    public static class MyObject {

        private double value;

        public MyObject(double value) {
            this.setValue(value);
        }

        public final void setValue(double value) {
            this.value = value;
        }

        public double getValue() {
            return this.value;
        }

    }

    public static void main(String[] args) {
        long start = 0;
        ArrayList<MyObject> objects = new ArrayList<MyObject>();

        start = System.currentTimeMillis();
        for (int i = 0; i < 1000000; ++i) {
            objects.add(new MyObject(Math.random()));
        }
        System.out.println("Time to create 1.000.000 objects: "
                + Long.toString(System.currentTimeMillis() - start)
                + " ms.");

        start = System.currentTimeMillis();
        for (int i = 0; i < 1000000; ++i) {
            objects.get(i).setValue(Math.random());
        }
        System.out.println("Time to reassign 1.000.000 objects: "
                + Long.toString(System.currentTimeMillis() - start)
                + " ms.");

    }

}

<强>输出

Time to create 1.000.000 objects: 323 ms.
Time to reassign 1.000.000 objects: 31 ms.