2016-11-03 155 views
0

我要开发一个简单的代码是这样的:Java供应商可以优化对象实例化过程吗?

public class TestSupplier { 


public static void main(String[] args) { 
    // TODO Auto-generated method stub 

    TestSupplier ts1 = new TestSupplier(); 

    List<String> lman = ts1.getList(new String[]{"Bob","Tom","Jack","Rob"}); 
    List<String> lwom = ts1.getList(new String[]{"Barbara","Francesca","Jenny","Sim"}); 
    List<String> ldog = ts1.getList(new String[]{"Ciuffy","Red","Fido"}); 


} 

public List<String> getList (String[] n) { 

    List<String> list1 = new ArrayList<String>(); 

    for (int i = 0; i < n.length ; i++) { 
     list1.add(n[i]); 
    } 

    return list1; 
} 

} 

每次程序调用“的GetList”方法的新列表1对象在内存中创建。 我试图找到优化此行为的最好方式,我有修改这样的代码:

public class TestSupplier { 

Supplier<List<String>> lsup = ArrayList<String>::new; 

public static void main(String[] args) { 
    // TODO Auto-generated method stub 

    TestSupplier ts1 = new TestSupplier(); 

    List<String> lman = ts1.getList(new String[]{"Bob","Tom","Jack","Rob"}); 
    List<String> lwom = ts1.getList(new String[]{"Barbara","Francesca","Jenny","Sim"}); 
    List<String> ldog = ts1.getList(new String[]{"Ciuffy","Red","Fido"}); 


} 

public List<String> getList (String[] n) { 

    List<String> list1 = lsup.get(); 

    for (int i = 0; i < n.length ; i++) { 
     list1.add(n[i]); 
    } 

    return list1; 
} 

} 

我已创建一个供应商的实例变量,并在“的GetList”的方法,我只是叫他GET方法来创建对象。

难道这是优化代码的最佳方法吗?

在此先感谢

+0

为了让代码更加优雅,我会在'getList()'中放置'varargs'参数。供应商在这里没有任何优势,因为每次调用getList()时都会创建一个列表,而不管供应商是否被使用。 – Kayaman

回答

1

这并没有优化代码。您每次都仍在创建一个新的ArrayList,除了不是直接调用构造函数,而是调用一个调用构造函数的供应商。所以它实际上稍微慢一些,而且更简单。我可以使用new ArrayList<>(Arrays.asList(n))。这样做至少可以初始化ArrayList,其初始大小足以包含数组中的所有元素,从而避免调整大数组的大小。或者只有Arrays.asList(n),如果原始数组支持的固定大小的列表是可接受的。