Java中的List或ArrayList声明差异是什么?

时间:2012-01-15 13:59:57

标签: java list arraylist

我是Java新手。 我想知道之间的区别:

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

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

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

由于

3 个答案:

答案 0 :(得分:11)

第一个仅在Java 7之后有效,并且相当于

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

它只是不那么冗长。

第三个相同,相当于

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

因此严格等同于第二个。

由于以下问题的答案中提到的原因,您应该更喜欢第一个:List versus ArrayList as reference type?

答案 1 :(得分:4)

三者有些相同:

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

在上面,您将声明一个实现List接口的变量,该接口将包含String个元素,并使用具体类ArrayList对其进行实例化。此外,您正在使用Java 7的新钻石语法,儿子,您不必再在String之间再次编写<>

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

在上面,您将声明一个包含ArrayList元素的具体类String的变量,并使用“传统”语法使用具体类ArrayList对其进行实例化。这要求您在String

之间指定<>类型
ArrayList<String> list = new ArrayList<>();

在上面,您将声明一个包含ArrayList元素的具体类String的变量,并使用具体类ArrayList对其进行实例化。此外,您正在使用Java 7的新钻石语法,儿子,您不必再在String之间再次编写<>

请注意,菱形语法(<>)仅适用于Java 7及更高版本,对于以前版本的Java,您使用传统语法(<the-type>)来实例化泛型。

最后两种形式完全相同;第一种形式有点不同,因为您指定list变量属于List类型而不是类型ArrayList - 这是首选形式,因为良好的面向对象实践要求你program to an 'interface', not an 'implementation'

答案 2 :(得分:2)

这里有两点要说明:

1.新的Java 7钻石运算符允许您实例化泛型类,而无需在两侧指定类型参数。所以这两个是等价的:

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

2.更重要的一点是前两个实例之间的差异。第二个是明确的:

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

在第一个:

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

您使用ArrayListList的子类型的事实,因此分配有效。但是,在新的list对象上,您只有List中包含的方法子集(因为您的对象毕竟被声明为List),但实现中存在的实现{1}}。这在面向对象编程中称为多态,并允许您使用类的子类型而不是父类所在的父类,以便提供各种不同的功能。