我正在学习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教程中找到了这个
我尝试过的完整示例代码如下所示。
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很新。
答案 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,则不能将其用作变量的类型。这是您遇到的问题。