在Java中键入列表与类型ArrayList
(1) List<?> myList = new ArrayList<?>();
(2) ArrayList<?> myList = new ArrayList<?>();
我明白,在(1)中, List接口的实现可以交换。 看起来(1)通常用于应用程序而不管需要(我自己总是使用它)。
我想知道是否有人使用(2)?
此外,这种情况实际上需要多长时间(并且我可以请一个例子)使用(1)over(2)(即,where(2)不足以......除了编码界面和最佳实践等)
几乎总是第一个比第二个更受欢迎。 第一个优点是List
的实现可以改变(例如LinkedList
),而不会影响其余的代码。 这对于使用ArrayList
是一项艰巨的任务,不仅因为您需要将ArrayList
更改为LinkedList
,而且还因为您可能使用了ArrayList
特定的方法。
你可以在这里阅读关于List
实现。 你可以从一个ArrayList
开始,但不久之后发现另一个实现更合适。
我想知道是否有人使用(2)?
是。 但很少有一个很好的理由。
有时候人们会因为使用ArrayList
而被烧毁,因为他们应该使用List
:
像Collections.singletonList(...)
或Arrays.asList(...)
这样的实用方法不会返回ArrayList
。
List
API中的方法不保证返回相同类型的列表。
例如,在https://stackoverflow.com/a/1481123/139985海报有“切片”的问题,因为ArrayList.sublist(...)
不会返回一个ArrayList
...并且他设计了他的代码使用ArrayList
作为其所有列表变量的类型。 他最终通过将子列表复制到新的ArrayList
来“解决”问题。
您需要知道List
行为的参数主要通过使用RandomAccess
标记接口来解决。 是的,这有点笨重,但另一种情况更糟。
此外,这种情况实际上需要多长时间使用(1)over(2)(即where(2)不足以......“接口编码”和最佳实践等)
问题的“多频繁”部分客观上无法回答。
(我能举个例子)
偶尔,应用程序可能会要求您使用ArrayList
API中不在List
API中的方法。 例如, ensureCapacity(int)
, trimToSize()
或removeRange(int, int)
。 (如果你创建了一个声明该方法public
的ArrayList的子类型,那么最后一个只会出现。
这是对班级进行编码而不是IMO接口的唯一合理原因。
(从理论上讲,在某些情况下,在某些平台上,性能可能会略有提高...但在某些平台上......除非您真的需要最后的0.05%,否则不值得这样做。合理的理由,IMO。)
如果您不知道随机访问是否有效,则无法编写高效的代码。
这是一个有效的观点。 但是,Java提供了更好的方法来处理这个问题。 例如
public <T extends List & RandomAccess> void test(T list) {
// do stuff
}
如果你用一个没有实现RandomAccess
的列表调用它,你会得到一个编译错误。
你也可以动态测试......使用instanceof
...如果静态类型太笨拙。 甚至可以编写代码以使用不同的算法(动态),具体取决于列表是否支持随机访问。
请注意, ArrayList
不是唯一实现RandomAccess
列表类。 其他的还包括CopyOnWriteList
, Stack
和Vector
。
我已经看到人们对Serializable
有相同的观点(因为List
没有实现它)......但是上面的方法也解决了这个问题。 (就使用运行时类型而言它是可解的程度来说,如果任何元素不可序列化,则ArrayList
将失败序列化。)
例如,你可能会决定一个LinkedList
是你的应用程序的最佳选择,但后来决定ArrayList
可能是一个更好的选择性能的原因。
使用:
List list = new ArrayList(100); // will be better also to set the initial capacity of a collection
代替:
ArrayList list = new ArrayList();
以供参考:
(主要张贴收集图)
链接地址: http://www.djcxy.com/p/18771.html上一篇: Type List vs type ArrayList in Java
下一篇: Hibernate hbm2ddl.auto possible values and what they do?