1

我是新学java。我想了解util包中的各种数据结构。

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

在我见过的 ArrayList 类的声明中

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

我的问题是,如果我使用 List<> 类型的对象来存储 ArrayList<> 的构造函数返回的对象

它会起作用吗?你可以假设我只需要使用 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

4 回答 4

3

由于ArrayList实现了List接口,您应该能够使用声明为 aList并初始化为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

于 2013-01-24T01:09:54.007 回答
2

考虑这个例子,

class A implements B {  }

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

C c = new A();

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

同样ArrayList是你的ClassA,你List的例子是Class B。

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

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

如果您使用上述分配,则不能调用 ArrayListtrimToSize()等方法。如果您想使用 ArrayList 方法,请按如下方式使用。

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

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

于 2013-01-24T01:15:51.473 回答
1

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

ArrayList<String>工具List<String>,所以它可以在那里生活。

于 2013-01-24T01:09:18.200 回答
1

编辑文件的顶部,如下所示:

包数组列表;导入 java.util.ArrayList;导入 java.util.List;

……

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

于 2013-01-24T01:19:44.343 回答