Java 重新初始化 Java 对象,具有新的、性能和内存



我想知道每次使用new编写以下代码以重新初始化对象以创建不同的对象值的缺点。

List <Value> valueList = new ArrayList<>;
Value value = new Value();    
value.setData("1");
valueList.add(value);
value = new value();
value.setData("2");
valueList.add(value);
value = new value();
value.setData("3");
valueList.add(value);

或者可以添加一个方法来返回类似于以下内容的值对象:

private Value getData(String input){
Value value = new Value();
value.setData(input);
return value;
}
List <Value> valueList = new ArrayList<>;
valueList.add(getData("1"));
valueList.add(getData("2"));
valueList.add(getData("3"));

代码方面,第二种方法对我来说看起来更好。

请根据内存和性能建议最佳方法。

这两个选项都是创建 3 个对象并将它们添加到列表中。记忆没有区别。性能无关紧要。如果此代码的执行频率足以"重要",则 JIT 无论如何都会内联这些方法调用。如果 JIT 决定:不够重要,无法内联,那么无论如何我们都在谈论纳米秒

因此:专注于编写干净的代码,以直接的方式完成工作。

从这个角度来看,我建议你宁愿有一个构造函数来获取这些数据;然后你可以写:

ValueList<Value> values = Arrays.asList(new Value("1"), new Value("2"), new Value("3"));

长话短说:性能是一个奢侈品问题。意思是:只有当你的测试/客户抱怨"事情花费太长时间"时,你才会担心性能。

在此之前,您担心创建一个好的、合理的 OO 设计并写下正确的实现。在构建良好的应用程序中修复某个性能问题要容易得多 - 与将"质量"放入由我们在您的问题中找到的想法驱动的代码库中相比。

请注意:这当然意味着您知道应该避免的典型"性能陷阱"。所以:一个有经验的Java程序员知道如何以有效的方式实现事物。

但是你作为一个新手:你专注于编写正确的、人类可读的程序。请记住,您的 CPU 每秒执行数十亿个周期 - 因此默认情况下性能正常。只有当你做非常大规模的事情时,你才需要担心。

最后:选项 2 实际上"更好"——因为它减少了代码重复的数量。

在这两种情况下,您都会创建 3 个存储在列表中的Value实例。
它在消耗的内存方面没有敏感差异。

最后一个仍然产生一个更干净的代码:你不重用同一个变量,并且变量的范围有限。
您确实有一个工厂方法可以完成工作并为您返回对象。
因此,客户端代码只需"消费"它。

另一种方法是带有 varargs 参数的方法:

private List<Value> getData(String... input){
// check not null before
List<Value> values = new ArrayList<>();
for (String s : input){
Value value = new Value();
value.setData(input);   
}
return values;   
}
List<Value> values = getData("1","2","3");

内存占用量没有区别,性能也几乎没有差异,因为方法调用非常便宜。

代码的第二种形式是第一种代码形式的更好看的版本,代码重复较少。除此之外,两者是等价的。

可以使用流缩短代码:

List<Value> = Arrays.asList("1", "2", "3").stream()
.map(Value::new)
.collect(Collectors.toList());

每次调用new运算符来创建对象时,它都会在堆上为该对象分配空间。使用第一种方法还是第二种方法都没关系,此对象以相同的方式分配给堆空间。

您需要了解的是您创建的每个对象的生命周期以及诸如依赖,聚合,关联和完整组合之类的术语。

最新更新