(1) List<?> myList = new ArrayList<?>();
(2) ArrayList<?> myList = new ArrayList<?>();
我知道,对于(1),List接口的实现可以交换。似乎(1)通常在应用程序中使用,无论是否需要(我自己总是使用它)。
我想知道是否有人使用(2)?
此外,情况实际上需要使用(1)而不是(2)的频率是多少(请给我一个例子)(即(2)是不够的..除了编码到接口和最佳实践等)。
(1) List<?> myList = new ArrayList<?>();
(2) ArrayList<?> myList = new ArrayList<?>();
我知道,对于(1),List接口的实现可以交换。似乎(1)通常在应用程序中使用,无论是否需要(我自己总是使用它)。
我想知道是否有人使用(2)?
此外,情况实际上需要使用(1)而不是(2)的频率是多少(请给我一个例子)(即(2)是不够的..除了编码到接口和最佳实践等)。
当前回答
我所知道的(2)可以更好的唯一情况是使用GWT,因为它减少了应用程序的占用空间(不是我的想法,但谷歌web工具包团队是这么说的)。但是对于在JVM(1)中运行的常规java来说,可能总是更好。
其他回答
当你写List时,你实际上告诉,你的对象只实现了List接口,但你没有指定你的对象属于什么类。
在编写ArrayList时,指定对象类是一个可调整大小的数组。
因此,第一个版本使您的代码将来更加灵活。
看看Java文档:
类ArrayList——List接口的可调整大小的数组实现。
接口列表-一个有序的集合(也称为序列)。该接口的用户可以精确控制每个元素在列表中的插入位置。
数组—容器对象,保存固定数量的单一类型的值。
列表接口有几个不同的类——ArrayList和LinkedList。LinkedList用于创建索引集合,ArrayList用于创建排序列表。你可以在你的参数中使用它,但是你可以允许其他使用你的代码,库等的开发人员使用不同类型的列表,而不仅仅是你在这个方法中使用的
ArrayList<Object> myMethod (ArrayList<Object> input) {
// body
}
你只能在ArrayList中使用它,而不是LinkedList,但是你可以允许在其他地方使用它的方法,这只是你的选择,所以使用接口可以允许它:
List<Object> myMethod (List<Object> input) {
// body
}
在这个方法参数中,你可以使用任何你想使用的List类:
List<Object> list = new ArrayList<Object> ();
list.add ("string");
myMethod (list);
结论:
尽可能在任何地方使用接口,不要限制您或其他人使用他们想要使用的不同方法。
例如,你可能认为LinkedList是应用程序的最佳选择,但后来又认为ArrayList可能是更好的选择。
Use:
List list = new ArrayList(100); // will be better also to set the initial capacity of a collection
而不是:
ArrayList list = new ArrayList();
供参考:
(主要用于收集图)
List几乎总是优先于ArrayList,因为,例如,List可以被转换为LinkedList而不影响其余的代码库。
如果使用ArrayList而不是List,就很难将ArrayList实现更改为LinkedList,因为代码库中已经使用了特定于ArrayList的方法,这也需要重构。
你可以在这里阅读关于List实现的信息。
您可以从ArrayList开始,但很快就会发现另一种实现是更合适的选择。
我会说1是首选,除非
你依赖于ArrayList中可选行为*的实现,在这种情况下显式使用ArrayList更清楚 你将在一个需要ArrayList的方法调用中使用ArrayList,可能用于可选的行为或性能特征
我的猜测是,在99%的情况下,您可以使用List,这是首选。
为实例removeAll,或add(null)