【问题标题】:List or Arrays for methods parameters? [closed]方法参数的列表或数组? [关闭]
【发布时间】:2016-04-28 21:26:33
【问题描述】:

我这里正在开发一些方法,其中一些需要有一个列表作为参数。

我想知道执行此操作的适当方法是使用 List 还是使用数组 [ ]。

例如:

void method_name(List< String > arg)
void method_name(String arg[])

推荐的选项是哪一个?

有人可以帮我吗?

【问题讨论】:

  • 两者兼有有什么原因吗?
  • 如果你需要一个列表作为参数,那就去吧,不知道实际方法很难说用什么。
  • 在我注意到 Google 在其Android APIs 的大部分(实际上我认为它是全部)使用数组之后,我开始怀疑。也许他们这样做是有原因的,也许这是正确的选择。
  • 就像我说的:上下文。 Android 是一个网络客户端。当这些值被序列化到/从 HTTP 序列化时,List 没有任何优势,因为它们的数字不会改变。这绝不会使数组在所有情况下都是正确的选择。如果这是真的,Joshua Bloch 永远不会编写 Java Collections API。
  • 很好的解释。在我的情况下,我不想更改方法内数组参数中的值,因此数组似乎是最好的选择。但是,使用 List 似乎更有用,因为用户在将它传递给我的方法之前可以更灵活地操作它。

标签: java


【解决方案1】:

记住List&lt;T&gt; 是一个接口。因此,将 List 作为参数传递会使您的代码更加灵活,因为它不依赖于 List 的特定实现。

因此,采用List&lt;String&gt; 作为参数的方法实际上可以采用ArrayList&lt;String&gt;LinkedList&lt;String&gt;List 接口的任何其他实现。所以它甚至可以接受MyList&lt;String&gt; 类型的参数,只要类MyList 声明它实现List 接口。这样做的好处是,如果您想在代码的其他地方从使用 ArrayList 更改为 LinkedList,此方法仍然有效。

相比之下,采用String[] 的方法只能采用String[]。因此,您将无法再更改在代码中其他位置存储这些字符串的方式,而无需更改方法。

关于为什么 Google 可能会在其 API 中大量使用数组作为参数,我认为这真的归结为他们使用它们 for 的目的。

所以我真的不能推荐其中一个。这实际上取决于该方法的作用以及您想对集合做什么。如需了解现代编程结构(如列表)与老式数组之间的主要区别,请查看this answer

【讨论】:

    【解决方案2】:

    这完全取决于您将如何使用这些对象。

    时使用列表

    1) 你要进行排序、搜索等操作,但不想写太多代码

    2) 如果元素的大小可能会因为 列表 可调整大小而增加。

    如果您的要求不符合上述要求,请使用数组。

    【讨论】:

      【解决方案3】:

      如果您的参数列表是固定的,只需根据需要使用尽可能多的参数

      method(String parameter1, String parameter2)
      

      我发现使用Arrays 很麻烦。有几个缺点:

      • 没有泛型,见here
      • 如果你想增强它,你必须将整个数组复制到一个更大的新数组中
      • 以及更多取决于您想要做什么

      特别是当您想在代码中使用Lists 时,您必须一直复制您的内容。所以我会说选择List

      method(List<String> parameterList)
      

      提到了另一种使用可变参数列表(varargs)的方法。但是,请注意,您不能将 vararg 参数简单地传递给使用 varargs 的另一个方法,因为 vararg 参数表示为一个数组,并将按原样传递。

      method1("first", "second");
      
      void method1(String... params) {
        //params[0] will be "first"
        //params[1] will be "second"
        method2(params);
      }
      
      void method2(String... params) {
        //params[0] will be an array of Strings
        //params[1] will give you an OutOfBoundsException
      }
      

      【讨论】:

        【解决方案4】:

        我认为您应该使用 List。 它速度较慢,但​​它提供了更大的灵活性并且更易于使用,尤其是在您要调整它们的大小时。

        【讨论】:

          【解决方案5】:

          我认为更流行的是数组参数。 无效方法名(字符串 arg[]) 您可以从数组中获取任何元素并了解数组中有多少元素。

          【讨论】:

            【解决方案6】:

            请记住,还有第三种选择,即

            void method(String... params)
            

            可以像数组一样访问我,但大小很灵活,您不必在方法调用之前将所有内容放入数组中,只需传递您的所有Strings。

            method(string1, string2, string3);
            

            【讨论】:

            • 但请注意,您不能将其传递给带有可变参数的第二种方法。 void method2(String... params) { //params[0] will be an array of Strings //params[1] will give you an OutOfBoundsException } void method1(String... params) { //params[0] will be "first" //params[1] will be "second" method2(params); } method1("first", "second");
            【解决方案7】:

            没有推荐或标准选项。列表和数组根本不是相同的对象类型。两者都在整个 Java 中使用。你可以做一个或两个(按类型重载)。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2017-04-29
              • 2014-02-17
              • 2014-05-20
              • 1970-01-01
              • 2015-06-23
              • 2011-07-21
              • 2014-08-07
              • 2012-08-18
              相关资源
              最近更新 更多