違い:
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() など) を持っている場合、
その場合、List () 内の a.i は 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のリストと配列リストの違いの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。