我是Java新手。 我想知道之间的区别:
List< String > list = new ArrayList<>();
和
ArrayList< String > list = new ArrayList<String>();
和
ArrayList< String > list = new ArrayList<>();
由于
答案 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<>();
您使用ArrayList
是List
的子类型的事实,因此分配有效。但是,在新的list
对象上,您只有List
中包含的方法子集(因为您的对象毕竟被声明为List
),但实现中存在的实现{1}}。这在面向对象编程中称为多态,并允许您使用类的子类型而不是父类所在的父类,以便提供各种不同的功能。