我有一个“按钮”的HashMap,可以用按键点击按钮的位置(x和y坐标)。每次从数据库接收到新数据时,按钮都会自行重新排列并更新它们在地图中的位置以及与“按钮”对象相关联的其他值。目前我将按钮作为不可变对象,因此每次收到新数据时都需要创建新按钮。
当我想到一个现实生活中的例子(购买一个新的,不同颜色版本的房子而不是画你已经拥有的那个)时,继续创建物品而不是仅仅重复使用旧物体似乎有点浪费,这是最好的方法吗?
答案 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.