爲什麼推薦使用List<Integer> list_A = new ArrayList<Integer>(); 而不是使用 ArrayList<Integer> list_A = new ArrayList<Integer>();
因爲List接口有多個實現類,List是一個很大的範圍,現在你用的是ArrayList,也許哪一天你需要把 List_A 換成其它的實現類,如 Vector, 這時你只要改變這一行就行了: List list_A = new LinkedList(); 其它使用了list_A地方的代碼根本不需要改動。
但如果一開始你就侷限了你的list_A是一種ArrayList,那麼當你想把list_A改爲其他List的子類型時,需要修改的地方就會有很多。
特別是如果你使用了ArrayList實現類特有的方法和屬性。
用接口去做是有它的好處的,如果你把類型定義成ArrayList(也就是一個具體的實現類)那麼你就只能接收這一種類型的數據了,如果你要是定義爲List那麼你不僅可以接收ArrayList的對象還可以接收LinkedList的對象,這樣你的程序就靈活了。
附上leetcode上面的一道楊輝三角題目的官方解析。
class Solution {
// 返回值是一個裝列表的列表,二維列表。
public List<List<Integer>> generate(int numRows) {
// 爲什麼使用List<Integer> list_A = new ArrayList<Integer>();
// 而不是使用 ArrayList<Integer> list_A = new ArrayList<Integer>();
// 因爲List接口有多個實現類,List是一個很大的範圍,現在你用的是ArrayList,
// 也許哪一天你需要把 List_A 換成其它的實現類,如 Vector,
// 這時你只要改變這一行就行了: List list_A = new LinkedList();
// 其它使用了list_A地方的代碼根本不需要改動。
// 但如果一開始你就侷限了你的list_A是一種ArrayList,
// 那麼當你想把list_A改爲其他List的子類型時,需要修改的地方就會有很多。
// 特別是如果你使用了ArrayList實現類特有的方法和屬性。
List<List<Integer>> triangle = new ArrayList<List<Integer>>();
if(numRows == 0){
return triangle;
}
// 第一行永遠是[1]
triangle.add(new ArrayList<>());
triangle.get(0).add(1);
for(int rowNum = 1; rowNum < numRows; rowNum++){ // rowNum是當前行數
List<Integer> row = new ArrayList<>(); // 當前行的list
List<Integer> prevRow = triangle.get(rowNum - 1); // 前一行的list
// the first element of each row is always 1
row.add(1);
for(int j = 1; j < rowNum; j++){
row.add(prevRow.get(j - 1) + prevRow.get(j));
}
// the last element of each row is always 1, too
row.add(1);
triangle.add(row);
}
return triangle;
}
}