我正在学习 CoreJava 书中的集合,我发现了这段代码:
List<String> a = new LinkedList<String>();
现在我想知道为什么这段代码不是这样的:
LinkedList<String> a = new LinkedList<String>();
为什么我们将 a 声明为List?
我正在学习 CoreJava 书中的集合,我发现了这段代码:
List<String> a = new LinkedList<String>();
现在我想知道为什么这段代码不是这样的:
LinkedList<String> a = new LinkedList<String>();
为什么我们将 a 声明为List?
List是接口,LinkedList是接口的具体实现。“编程到‘接口’,而不是‘实现’:http ://en.wikipedia.org/wiki/Design_Patterns#Introduction.2C_Chapter_1
如果您需要使用特定于LinkedList
. 但这种需求通常很少见。第一个更通用——它允许您List
通过仅更改一行来使用不同的实现。其他代码(如方法参数)不需要更改。
PS只是要清楚 - aLinkedList
是List
.
编码:
List<String> list = new LinkedList<String>();
优于:
LinkedList<String> list = new LinkedList<String>();
这是因为如果你声明list
为List
,发现程序的性能不好,你可以把代码改成:
List<String> list = new ArrayList<String>();
看看程序是否运行得更快。这样做的好处是您可以进行更改而无需更改其余代码。
作为结论,如果可能,将引用声明为接口(List
是接口):
List<String> list;
并且您可以轻松切换实现(class ArrayList
并且class LinkedList
是接口的实现List
):
list = new LinkedList<String>();
或者
list = new ArrayList<String>();
另一个很好的例子。
为什么我们将 a 声明为 List?
考虑一个方法:
public void doStuff(LinkedList llObj){}
这显示了对用户只允许传递 LinkedList 的方法的限制。
public void doStuff(List listObj) {}
而此方法允许传递任何列表。
希望这可以帮助。
在 Java 中,与所有其他 OOP 语言一样,设计的主要优势之一是多态性。多态性只是不包括方法,但也扩展到类,并采用子类型、多类型等名称。
在您的第一个代码示例中:
List<String> a = new LinkedList<String>();
使引用变量“a”的类型采用“List”类型的任何具体扩展。
在下一个代码示例中:
LinkedList<String> a = new LinkedList<String>();
引用变量“a”可以采用“LinkedList”类型的任何扩展。
要了解它的强大功能,我们应该检查 LinkedList 的类型层次结构:http: //docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html
因此,在您的第一个示例中,您增加了将“a”引用到任何具体类型的“List”的范围,其中还包括 LinkedList,而在第二个示例中,您将范围缩小为仅键入“LikedList”及其子类型。
一个并不比另一个好,但很大程度上取决于您的代码设计和应用程序,哪种方法最适合您的用例。
一些不错的读物:
子类型多态性:http ://en.wikipedia.org/wiki/Polymorphism_(computer_science)#Subtyping