ArrayList对象存储在List变量中

时间:2013-01-24 01:07:40

标签: java interface javac

我正在学习java.I我正在尝试理解util包中的各种数据结构。

/*create an ArrayList object*/
List<String> arrayList = new ArrayList<String>();

在我看到的ArrayList类的删除中

public class ArrayList
extends AbstractList
implements List, RandomAccess, Cloneable, Serializable

我的问题是,如果我使用List&lt;&gt;类型的对象存储ArrayList&lt;&gt;

的构造函数返回的对象

它会工作。你可以假设我只需要使用List接口中指定的方法,例如add()或size()。

我在我的机器上尝试了这个并且它不起作用。我在下面的java教程中找到了这个

  

http://www.javamex.com/tutorials/collections/using_1.shtml

我尝试过的完整示例代码如下所示。

package arraylist;
import java.util.ArrayList;
import java.util.List;

public class ArrayListExample {

        public static void main(String[] args)
        {

        /*create an ArrayList object*/
         List<String> arrayList = new ArrayList<String>();

                /*
                Add elements to Arraylist using
                boolean add(Object o) method. It returns true as a general behavior
                of Collection.add method. The specified object is appended at the end
                of the ArrayList.
                 */
        arrayList.add("1");
        arrayList.add("2");
        arrayList.add("3");

        /*
        Use get method of Java ArrayList class to display elements of ArrayList.
        Object get(int index) returns and element at the specified index in
        the ArrayList
         */
        System.out.println("Getting elements of ArrayList");
        System.out.println(arrayList.get(0));
        System.out.println(arrayList.get(1));
        System.out.println(arrayList.get(2));
    }
}

我忘了导入List。这就是为什么它不起作用。但是我的下一个问题是我们使用List类型的变量存储在ArrayList类型的对象上。

比较List和ArrayList的方法ArrayList有一个名为trimToSize()的方法,该方法不在列表中。

在上述情况下,我可以调用该方法吗?

如果是,那通常意味着基类指针可用于存储派生类对象,因为派生类的方法列表将始终是基类方法的超集?

我的上述结论是否正确?这是我愚蠢的问题,但我对java很新。

4 个答案:

答案 0 :(得分:3)

由于ArrayList实现了List接口,您应该能够使用声明为List的对象,该对象初始化为ArrayList。这是很常见的做法。它允许您在不更改代码的情况下切换列表的实现。

确保导入列表界面:

package arraylist;
import java.util.ArrayList;
import java.util.List;

public class ArrayListExample {

        public static void main(String[] args)
        {

        /*create an ArrayList object*/
         List<String> arrayList = new ArrayList<String>();

                /*
                Add elements to Arraylist using
                boolean add(Object o) method. It returns true as a general behavior
                of Collection.add method. The specified object is appended at the end
                of the ArrayList.
                 */
        arrayList.add("1");
        arrayList.add("2");
        arrayList.add("3");

        /*
        Use get method of Java ArrayList class to display elements of ArrayList.
        Object get(int index) returns and element at the specified index in
        the ArrayList
         */
        System.out.println("Getting elements of ArrayList");
        System.out.println(arrayList.get(0));
        System.out.println(arrayList.get(1));
        System.out.println(arrayList.get(2));
    }
}

引用List时,您将无法使用trimToSize功能,因为它不在List

的界面上

答案 1 :(得分:2)

考虑这个例子,

class A implements B {  }

在这种情况下,可以将类分配给其实现的接口之一的类型的变量。

C c = new A();

如果在使用c的实例时执行此转换,则只能访问C类中可用的方法。

同样ArrayList是您的ClassA,而您的List是B类。

在下面的使用arraylist实例中,您可以调用List接口中可用的方法,

/*create an ArrayList object*/
List<String> arrayList = new ArrayList<String>();

如果你使用上面的赋值,就不能调用像trimToSize()等类似的ArrayList方法。如果你想使用ArrayList方法,只需使用如下。

/*create an ArrayList object*/
ArrayList<String> arrayList = new ArrayList<String>();

大多数开发人员,90%的时间都使用List提供的方法,这就是为什么所有示例都遵循前一种方法的原因。

答案 2 :(得分:1)

List<String> arrayList表示'此变量只能存储List<String>接口的实现'

ArrayList<String>实施List<String>,以便它可以在那里生效。

答案 3 :(得分:1)

将文件顶部编辑为如下所示:

包arraylist; import java.util.ArrayList; import java.util.List;

...

如果您尚未导入List,则不能将其用作变量的类型。这是您遇到的问题。