嗨,我之间没有一个明确的想法,
List<String> list = new ArrayList<String>();
和
ArrayList<String> list = new ArrayList<String>();
答案 0 :(得分:7)
List<String> list = new ArrayList<String>();
创建一个类型为字符串的List,该列表可以潜在地类型转换为任何其他类型的列表。这称为解耦。您正在将代码与接口的特定实现分离。它提供的优点是,在编写大量代码时,您可以在列表类型之间切换以满足您的偏好(速度,内存等),因为您的所有代码都可以将列表视为类型列表。您还可以将List作为参数传递并从函数中返回List。如果你对ArrayList不满意,那么稍后就改变那一行代码
List<String> list = new ArrayList<String>(); // old code
List<String> list = new LinkedList<String>(); // new code
// The rest of the code doesnt need changing
...
list = getList();
...
public List<String> getList() {
List<String> temporaryList;
...
return temporaryList;
}
public void changeList(List<string> localListVariable) {}
您的程序将按预期运行。
另一方面,
ArrayList<String> list = new ArrayList<String>();
创建String类型的ArrayList,它不能用作任何其他类型的List(Vector,LinkedList等)。因此,它受ArrayList可用方法的约束。
如果您现在想要更改所使用的列表类型,则必须在整个程序中更改所有函数参数和返回类型等(无论您何时必须创建ArrayList<String>
来处理变量)。 / p>
答案 1 :(得分:1)
List<String>
是ArrayList<String>
的超类(或可能是有效的接口)。允许将ArrayList<String>
的实例分配给List<String>
变量。它以某种方式成为动态铸造的一种形式。访问List<String> list
时,只能使用List<String>
可访问的方法;尽管对象是ArrayList<String>
的实例,但ArrayList<String>
中的那些将被隐藏。
答案 2 :(得分:1)
在这两种情况下,您都可以创建ArrayList
的对象。但List<String> list = new ArrayList<String>();
将使用List<String>
的引用引用该对象,而ArrayList<String> list = new ArrayList<String>();
将使用ArrayList<String>
类型的引用变量引用该对象。
例如,您可以使用ensureCapacity
的引用调用名为ArrayList<String>
的方法,但不能使用List<String>
的引用来执行此操作。
以下将编译:
ArrayList<String> list = new ArrayList<String>();
list.ensureCapacity(10); // This will work
以下不会编译:
List<String> list = new ArrayList<String>();
list.ensureCapacity(10); // This will not compile
答案 3 :(得分:1)
关于你获得的内存中的实例没有区别。但是,编程接口被认为是一种很好的做法(参见例如What does it mean to "program to an interface"?)。许多Java API是根据接口定义的,即功能将独立地使用您使用的特定接口的实现。这有助于代码清晰度和质量,并降低因依赖实现类的某些特定属性而产生的错误的可能性(除非这些属性非常重要)。
答案 4 :(得分:0)
ArrayList创建一个ArrayList类型的对象,List创建一个List类型的对象,ArrayLists底层接口。如果您不知道接口是什么,请搜索javadoc。