2017-08-04 51 views
0

我想知道使用新的编写下面代码的缺点,用于每次重新初始化对象以创建不同的对象值。具有新的性能和内存的Java重新初始化java对象

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

代码明智的第二种方法看起来好一点。

请根据内存和性能提出最佳方法。

+0

我不确定你想知道什么。但一般情况下,如果你可以重复使用你的物体,那就去做吧。新对象的创建始终是成本高昂的。但要注意的是,java使用按值调用。看到这里以及:https://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value –

+0

'新'不重新初始化一个对象,它创建一个**新的**对象。 –

+0

“ValueList valueList = new ArrayList <>;”迷惑了我。你的意思是“列表 valueList = new ArrayList <>;”? ArrayList实现了List,但我从来没有听说过称为ValueList的接口。我认为,代码不会编译。 –

回答

1

在内存占用方面没有差异,并且性能差别不大,因为方法调用非常便宜。

代码的第二种形式是代码的第一种形式的更好看的版本,代码重复性较低。除此之外,两者是相同的。

您可以通过使用流缩短代码:

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

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

因此:重点写作干净代码,以直接的方式完成工作。

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

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

长话短说:性能豪华问题。含义:当您的测试/客户抱怨“事情花费太长时间”时,您只担心性能问题。

在此之前,您担心创建一个良好的,完善的OO设计并写下正确的实现。在良好构建的应用程序中修复某个性能问题要容易得多 - 相比于将“质量”转化为由我们在您的问题中发现的想法驱动的代码库。

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

但你作为新手:你只有重点写在正确的,人类可读的程序。请记住,您的CPU每秒处理数十亿次循环 - 因此,默认情况下,性能很简单。当你在超大规模上做事情时,你只需要担心。

最后:选项2其实是“更好” - 因为它减少了代码重复量。

2

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

最后一个产生更清晰的代码:您不重复使用同一个变量并且变量的作用域有限。
你确实有一个工厂方法来完成这项工作并为你返回对象。
所以客户端代码只是“消费”它。

另一种方法是用一个可变参数参数的方法:

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"); 
0

你叫操作创建一个对象的时候,它分配的空间上堆此对象。不管你使用第一种方法还是第二种方法,这些对象都以相同的方式分配给堆空间。

你需要了解的是你创建的每个对象的生命周期以及像依赖,聚合,关联和完整构成这样的术语。