區別:
List是一個接口,而ArrayList是List接口的實作類別。 ArrayList類別繼承並實作了List介面。
因此,List接口不能被構造,也就是我們說的不能創建實例對象,但是我們可以像下面那樣為List接口創建一個指向自己的對象引用,而ArrayList實現類的實例對象就在這充當了這個指向List介面的物件參考。
Animals.java public abstract class Animals { //动物名字 String name; //动物叫声 public void shout(){ System.out.println("叫声----"); } } Dog.java public class Dog extends Animals { //狗类独有的方法 public void guard(){ System.out.println("狗独有的看门本领"); } } Test.java public class Test { public static void main(String[] args) throws ClassNotFoundException { Animals a1 = new Animals(); Animals a2 = new Dog(); } }
List list;//正确,list = null; List list = new List();//是错误的用法
List list = new ArrayList();
這句話建立了一個ArrayList實作類別的物件後把它上溯到了List介面。此時它就是一個List物件了,它有些ArrayList類別具有的,但是List介面沒有的屬性和方法,它就不能再用了,而
ArrayList list=newArrayList();
創建一物件則保留了ArrayList的所有屬性和方法。
Test.java public class Test { public static void main(String[] args) throws ClassNotFoundException { Animals a2 = new Dog(); a2.shout(); a2.guard(); } }
父類別不能再呼叫父類別出現而子類別沒有出現的方法。否則會編譯出錯。
如果是下面這個樣子的:
List a=new ArrayList();
則a擁有List的所有屬性和方法,不會擁有其實作類別ArrayList的獨有的屬性和方法。
如果List與ArrayList中有相同的屬性(如int i),有相同的方法(如void f()),
則a.i是呼叫了List中的i,a.f ()是呼叫了ArrayList中的f();
問題的關鍵:
為什麼要用 List list = new ArrayList()
而不用 ArrayList alist = new ArrayList()
呢?
問題就在於List介面有多個實作類,現在你用的是ArrayList,也許哪一天你需要換成其它的實作類,如:
LinkedList或Vector等等,這時你只要改變這一行就行了: List list = new LinkedList();
其它使用了list地方的程式碼根本不需要改變。
假設你開始用ArrayList alist = new ArrayList()
, 這下你有的改了,特別是如果你使用了ArrayList實作類別特有的方法和屬性。
推薦教學:Java教學
以上是java中list與arraylist的差別的詳細內容。更多資訊請關注PHP中文網其他相關文章!