【问题标题】:Difference between int[] array and int array[]int[] 数组和 int 数组[] 的区别
【发布时间】:2010-10-02 01:55:05
【问题描述】:

最近一直在思考两种定义数组方式的区别:

  1. int[] array
  2. int array[]

有区别吗?

【问题讨论】:

    标签: java arrays


    【解决方案1】:

    它们在语义上是相同的。添加int array[] 语法只是为了帮助 C 程序员习惯 java。

    int[] array 更可取,而且不那么混乱。

    【讨论】:

    • [] 是 TYPE 的一部分,而不是 NAME 的一部分。对我来说,这是最大的不同。
    • @Andre - 在 C 中, [] 它是声明符的一部分,而不是声明说明符,因此是 int array[] 语法。也是合乎逻辑的......以某种扭曲的方式。 :)
    • C 玩这个小游戏 :) 我觉得它很迷人 :) 即使有类似的...指针。指针的“正确”c 语法是 int *imAPointer。它既愚蠢又整洁。
    • int array[] 对我来说更有意义。你怎么看这个宣言? int[] x, y? y 是不是一个数组?也许是,也许不是。只有 Java 大师才能自信地回答....
    • int[] x, y的情况下y是数组(因为[]属于该类型),int x[], y的情况下y不是数组(@987654332 @ 属于变量)。
    【解决方案2】:

    在 Java 中,这些只是说同一件事的不同语法方法。

    【讨论】:

      【解决方案3】:

      它们是一样的。一个比另一个更具可读性(对某些人来说)。

      【讨论】:

        【解决方案4】:

        它们是完全等价的。 int [] array 是首选样式。 int array[] 只是作为等效的 C 兼容样式提供的。

        【讨论】:

          【解决方案5】:

          没有区别,但 Sun 建议将其放在类型旁边,如 here 所解释的那样

          【讨论】:

            【解决方案6】:

            这两个命令是一回事。

            您可以使用语法来声明多个对象:

            int[] arrayOne, arrayTwo; //both arrays
            
            int arrayOne[], intOne; //one array one int 
            

            见:http://java.sun.com/docs/books/jls/second_edition/html/arrays.doc.html

            【讨论】:

              【解决方案7】:

              如果您碰巧在同一个声明中声明了多个变量,则有一点区别:

              int[] a, b;  // Both a and b are arrays of type int
              int c[], d;  // WARNING: c is an array, but d is just a regular int
              

              请注意,这是一种糟糕的编码风格,尽管编译器几乎肯定会在您尝试使用 d 时捕捉到您的错误。

              【讨论】:

                【解决方案8】:

                两者没有任何区别;两者都声明了一个ints 的数组。但是,前者是首选,因为它将类型信息都保存在一个地方。后者只是为了 C/C++ 程序员转向 Java 的利益才真正得到支持。

                【讨论】:

                  【解决方案9】:

                  没有区别。

                  引用Sun:

                  [] 可以作为类型的一部分出现在声明的开头,或者作为特定变量的声明符的一部分,或者两者兼而有之,如下例所示:byte[] rowvector, colvector, matrix[];

                  此声明等效于: byte rowvector[], colvector[], matrix[][];

                  【讨论】:

                    【解决方案10】:

                    没有区别。

                    我更喜欢type[] name 格式,很明显该变量是一个数组(不用四处寻找它是什么)。

                    编辑:

                    哦,等等,有区别(我忘记了,因为我一次从不声明多个变量):

                    int[] foo, bar; // both are arrays
                    int foo[], bar; // foo is an array, bar is an int.
                    

                    【讨论】:

                      【解决方案11】:

                      没有真正的区别;然而,

                      double[] items = new double[10];
                      

                      是首选,因为它清楚地表明该类型是一个数组。

                      【讨论】:

                      • double items[] 真的适合 C 程序员
                      • @Steve,这就是我一直这样做的原因。 :-)
                      • 可以反驳说 double items[] 清楚地表明了类型,然后项目恰好是一个数组——这完全取决于你对什么感到满意。
                      【解决方案12】:

                      最首选的选项是int[] a - 因为int[] 是类型,a 是名称。 (您的第二个选项与此相同,空间错位)

                      它们在功能上没有区别。

                      【讨论】:

                        【解决方案13】:

                        Java Language Specification 说:

                        The [] may appear as part of the type at the beginning of the declaration,
                        or as part of the declarator for a particular variable, or both, as in this
                        example:
                        
                        byte[] rowvector, colvector, matrix[];
                        
                        This declaration is equivalent to:
                        
                        byte rowvector[], colvector[], matrix[][];
                        

                        因此它们将产生完全相同的字节码。

                        【讨论】:

                          【解决方案14】:

                          不,这些是一样的。不过

                          byte[] rowvector, colvector, matrix[];
                          

                          相当于:

                          byte rowvector[], colvector[], matrix[][];
                          

                          取自Java Specification。这意味着

                          int a[],b;
                          int[] a,b;
                          

                          不一样。我不会推荐这些多重声明中的任何一个。最容易阅读的(可能)是:

                          int[] a;
                          int[] b;
                          

                          【讨论】:

                          • 最好的做法是每个标识符使用一个声明,而不是在一行中声明多个标识符。
                          • @rsp - 完全同意,编辑了一个最佳实践。不过,它暗示了什么是好的实践。
                          【解决方案15】:

                          两种声明风格在功能上没有区别。两者都声明 int 数组。

                          但是int[] a 将类型信息放在一起并且更冗长,所以我更喜欢它。

                          【讨论】:

                            【解决方案16】:

                            两者含义相同。但是,这些变体的存在也允许这样做:

                            int[] a, b[];
                            

                            等同于:

                            int[] a;
                            int[][] b;
                            

                            但是,这是一种糟糕的编码风格,永远不应该这样做。

                            【讨论】:

                            • 你的意思是,int[] a, b[]; b 变成一个多维数组
                            【解决方案17】:

                            是的,完全一样。个人比较喜欢

                            int[] integers; 
                            

                            因为它让任何阅读您的代码的人都立即明白整数是一个 int 数组,而不是

                            int integers[];
                            

                            这并不那么明显,特别是如果您在一行中有多个声明。但同样,它们是等价的,所以这取决于个人喜好。

                            查看this page on arrays in Java 了解更深入的示例。

                            【讨论】:

                              【解决方案18】:

                              两者都可以。我建议选择一个并坚持下去。 (我做第二个)

                              【讨论】:

                                【解决方案19】:

                                它们是相同的,但是这些语句之间有一个重要的区别:

                                // 1.
                                int regular, array[];
                                // 2.
                                int[] regular, array;
                                

                                在 1.regular 只是一个 int,而 2.regular 和 array 都是 int 的数组。

                                因此,您的第二个陈述是首选,因为它更清楚。根据this tutorial on Oracle也劝阻第一种形式。

                                【讨论】:

                                • 谢谢大家!我会选择第二个并坚持下去。
                                【解决方案20】:

                                虽然int integers[] 解决方案源于 C 语言(因此可以被认为是“正常”方法),但许多人发现int[] integers 更合乎逻辑,因为它不允许创建不同类型的变量(即 int 和 an数组)在一个声明中(与 C 样式声明相反)。

                                【讨论】:

                                  【解决方案21】:

                                  它是另一种形式,是从C借来的,java是基于它的。

                                  出于好奇,有三种方法可以在java中定义一个有效的main方法:

                                  • public static void main(String[] args)
                                  • public static void main(String args[])
                                  • public static void main(String... args)

                                  【讨论】:

                                  • 恕我直言,但这个答案是问题!!!!指定的第三种形式实际上必须按照原始帖子中的要求做任何事情。前两个参数是 main 方法的数组,尽管第三个实体是变量参数(与数组不同)。如果定义主方法是问题,那么也可以添加另一种形式来定义主方法,例如public static void main ( String \u005B \u005D args ),这也是另一种变体。
                                  • @nIcEcOw 一个可变参数,例如String... param一个数组
                                  • 只是一个简单的疑问,如果两者都是数组,即 String[] 和 String..., then why it is not possible to call a method like say someMethod (1, 2)` 如果将 someMethod 定义为 someMethod ( int[] numbers )。数组要求参数必须来自连续的内存位置,尽管varargs 将首先从提供的参数中创建一个数组。此外,varargs 只能是方法的最后一个参数,但数组并非如此。
                                  • @nIcEcOw 但您可以使用数组调用可变参数,即meth(int... a) 可以称为meth(1, 2)meth(new int[] {1, 2})。 Varargs 是将第一个版本转换为第二个版本的语法糖。参数的实际(字节码)类型是数组类型。至于必须排在最后,如果您考虑一下,没有其他明智的选择。
                                  【解决方案22】:

                                  两者同样有效。但是不鼓励使用int puzzle[] 形式,根据coding conventions,首选int[] puzzle。另见官方Java arrays tutorial

                                  同样,你可以声明其他类型的数组:

                                  byte[] anArrayOfBytes;
                                  short[] anArrayOfShorts;
                                  long[] anArrayOfLongs;
                                  float[] anArrayOfFloats;
                                  double[] anArrayOfDoubles;
                                  boolean[] anArrayOfBooleans;
                                  char[] anArrayOfChars;
                                  String[] anArrayOfStrings;
                                  

                                  您也可以在数组名称之后放置方括号:

                                  float anArrayOfFloats[]; // this form is discouraged
                                  

                                  但是,惯例不鼓励这种形式;括号标识数组类型,并应与类型名称一起出现。

                                  注意最后一段。

                                  我建议阅读官方的 Sun/Oracle 教程,而不是一些 3rd 方的教程。否则,您将面临学习不良做法的风险。

                                  【讨论】:

                                    【解决方案23】:

                                    来自section 10.2 of the Java Language Specification

                                    [] 可以作为类型的一部分出现在声明的开头,或者作为特定变量的声明符的一部分,或者两者兼而有之,如下例所示:

                                     byte[] rowvector, colvector, matrix[];
                                    

                                    这个声明相当于:

                                    byte rowvector[], colvector[], matrix[][];
                                    

                                    就我个人而言,几乎所有我见过的 Java 代码都使用第一种形式,通过将有关变量的所有类型信息保存在一个地方更有意义。老实说,我希望第二种形式被禁止……但这就是生活……

                                    幸运的是,我认为我曾经见过这个(有效的)代码:

                                    String[] rectangular[] = new String[10][10];
                                    

                                    【讨论】:

                                    • 谢谢,我为此挠头了。奇怪的是,在谷歌搜索问题的标题时,我什么也没找到......
                                    • +1 我同意禁止使用第二种形式。 +1 也是因为我没有意识到你可以像int[] a[]; 这样混合'n'匹配 - 这永远会不清楚;-)
                                    【解决方案24】:

                                    在声明单个数组引用时,它们之间没有太大区别。所以下面的两个声明是一样的。

                                    int a[];  // comfortable to programmers who migrated from C/C++
                                    int[] a;  // standard java notation 
                                    

                                    在声明多个数组引用时,我们可以发现它们之间的区别。以下两个陈述意思相同。实际上,由程序员决定跟随哪个。但建议使用标准的 java 表示法。

                                    int a[],b[],c[]; // three array references
                                    int[] a,b,c;  // three array references
                                    

                                    【讨论】:

                                      【解决方案25】:

                                      如前所述,没有太大区别(如果每行只声明一个变量)。

                                      请注意,SonarQube 将您的第二种情况视为轻微的代码异味:

                                      数组指示符“[]”应该在类型上,而不是变量上 (squid:S1197)

                                      数组指示符应始终位于类型上以获得更好的代码 可读性。否则,开发人员必须同时查看类型和 变量名来判断一个变量是否是一个数组。

                                      不合规代码示例

                                      int matrix[][];   // Noncompliant
                                      int[] matrix[];   // Noncompliant
                                      

                                      合规解决方案

                                      int[][] matrix;   // Compliant
                                      

                                      【讨论】:

                                        【解决方案26】:

                                        是的,有区别。

                                        int[] a = 新的 int[100]; // 'a' 本身不是数组,数组存储为地址 在内存的其他地方,'a' 只保存那个地址

                                        int b[] = 新的 int[100]; // 在创建像 cleary 这样的数组时,显示 'b' 是一个数组,它 是整数类型。

                                        【讨论】:

                                        • 不是在 Java 中。 ab 都持有对数组的引用。
                                        猜你喜欢
                                        • 2014-09-10
                                        • 2013-09-21
                                        • 2012-01-15
                                        • 1970-01-01
                                        相关资源
                                        最近更新 更多