List <string> list = new ArrayList <string>()和ArrayList <string> list = new ArrayList <string>()?</string> </string> </string> </string>之间有什么区别?

时间:2014-06-02 09:18:47

标签: java arraylist

嗨,我之间没有一个明确的想法,

List<String> list = new ArrayList<String>();

ArrayList<String> list = new ArrayList<String>();

5 个答案:

答案 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。