2016-11-03 64 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),如果原始數組支持的固定大小的列表是可接受的。