在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列表类。 其他的还包括CopyOnWriteListStackVector

    我已经看到人们对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?