【问题标题】:What is difference between List<String> list = new ArrayList<String>() and ArrayList<String> list = new ArrayList<String>()? [duplicate]List<String> list = new ArrayList<String>() 和 ArrayList<String> list = new ArrayList<String>() 有什么区别? [复制]
【发布时间】:2014-07-22 08:51:55
【问题描述】:

你好,我之间没有明确的想法,

List<String> list = new ArrayList<String>();

ArrayList<String> list = new ArrayList<String>();

【问题讨论】:

标签: java arraylist


【解决方案1】:
List<String> list = new ArrayList<String>();

创建一个字符串类型的列表,并且该列表可以潜在地类型转换为任何其他类型的列表。这称为解耦。您正在将代码与接口的特定实现解耦。它提供的优点是,在编写大量代码时,您可以在列表类型之间切换以适应您的偏好(速度、内存等),因为您的所有代码都可以将您的列表视为仅键入 List。您还可以将 List 作为参数传递并从函数返回 List。以后如果你对 ArrayList 不满意,你只需更改那一行代码

List<String> list = new ArrayList<String>(); // old code
List<String> list = new LinkedList<String>(); // new code

// The rest of the code doesnt need changing

...
list = getList();
...

public List<String> getList() {
  List<String> temporaryList;
  ...
  return temporaryList;
}

public void changeList(List<string> localListVariable) {}

您的程序将按预期运行。


另一方面,

ArrayList<String> list = new ArrayList<String>();

创建一个字符串类型的 ArrayList,它不能用作任何其他类型的列表(Vector、LinkedList 等)。因此,它受 ArrayList 可用方法的约束。 如果您现在想更改所用列表的类型,则必须在整个程序中更改所有函数参数和返回类型等(无论您在哪里必须创建 ArrayList&lt;String&gt; 来处理您的变量)。

【讨论】:

    【解决方案2】:

    在这两种情况下,您都创建了ArrayList 的对象。但是List&lt;String&gt; list = new ArrayList&lt;String&gt;(); 将通过使用List&lt;String&gt; 的引用来引用该对象,而ArrayList&lt;String&gt; list = new ArrayList&lt;String&gt;(); 将通过使用ArrayList&lt;String&gt; 类型的引用变量来引用该对象。

    例如,您可以使用 ArrayList&lt;String&gt; 的引用来调用名为 ensureCapacity 的方法,但不能使用 List&lt;String&gt; 的引用来调用。

    以下将编译:

    ArrayList<String> list = new ArrayList<String>();
    list.ensureCapacity(10);    // This will work
    

    以下内容无法编译:

    List<String> list = new ArrayList<String>();
    list.ensureCapacity(10);    // This will not compile
    

    【讨论】:

    • 在任何一种情况下,您都在创建ArrayList 的对象,而不是List 的对象,尽管ArrayList IS-A List。因此,在这种情况下,ListArrayList 的对象之间没有任何区别
    • 只是为了完成您的答案:您可以添加演员表,然后第二个示例也将编译: List list = new ArrayList(); ((ArrayList) 列表).ensureCapacity(10); // 这将编译。但是添加演员表使第二个示例实际上与第一个示例相同。
    【解决方案3】:

    对于您获得的内存中的实例没有区别。然而,编程到接口被认为是一种很好的做法(参见例如What does it mean to "program to an interface"?)。许多 Java API 是根据接口定义的,即功能将独立于您使用的特定接口的哪个实现工作。这有助于代码的清晰度和质量,并减少因依赖实现类的某些特定属性而出现错误的可能性(除非这些属性非常重要)。

    【讨论】:

      【解决方案4】:

      List&lt;String&gt;ArrayList&lt;String&gt; 的超类(或可能是有效接口)。允许将ArrayList&lt;String&gt; 的实例分配给List&lt;String&gt; 变量。它在某种程度上是一种动态铸造的形式。访问List&lt;String&gt; list时,只能使用List&lt;String&gt;访问的方法;尽管对象是ArrayList&lt;String&gt; 的实例,但来自ArrayList&lt;String&gt; 的对象将被隐藏。

      【讨论】:

        【解决方案5】:

        ArrayList创建一个ArrayList类型的对象,List创建一个List类型的对象,ArrayLists底层接口。如果您不知道接口是什么,请搜索 javadocs。

        【讨论】:

        • ArrayList 的对象是否比List 的对象占用更多的内存空间?
        • 你不应该担心这个
        猜你喜欢
        • 2017-05-08
        • 1970-01-01
        • 2015-12-07
        • 2013-03-27
        • 1970-01-01
        • 2014-01-09
        • 2014-04-12
        • 1970-01-01
        • 2019-03-15
        相关资源
        最近更新 更多