【发布时间】:2010-10-02 01:55:05
【问题描述】:
最近一直在思考两种定义数组方式的区别:
int[] arrayint array[]
有区别吗?
【问题讨论】:
最近一直在思考两种定义数组方式的区别:
int[] arrayint array[]有区别吗?
【问题讨论】:
它们在语义上是相同的。添加int array[] 语法只是为了帮助 C 程序员习惯 java。
int[] array 更可取,而且不那么混乱。
【讨论】:
int array[] 语法。也是合乎逻辑的......以某种扭曲的方式。 :)
int array[] 对我来说更有意义。你怎么看这个宣言? int[] x, y? y 是不是一个数组?也许是,也许不是。只有 Java 大师才能自信地回答....
int[] x, y的情况下y是数组(因为[]属于该类型),int x[], y的情况下y不是数组(@987654332 @ 属于变量)。
在 Java 中,这些只是说同一件事的不同语法方法。
【讨论】:
它们是一样的。一个比另一个更具可读性(对某些人来说)。
【讨论】:
它们是完全等价的。 int [] array 是首选样式。 int array[] 只是作为等效的 C 兼容样式提供的。
【讨论】:
没有区别,但 Sun 建议将其放在类型旁边,如 here 所解释的那样
【讨论】:
这两个命令是一回事。
您可以使用语法来声明多个对象:
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
【讨论】:
如果您碰巧在同一个声明中声明了多个变量,则有一点区别:
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 时捕捉到您的错误。
【讨论】:
两者没有任何区别;两者都声明了一个ints 的数组。但是,前者是首选,因为它将类型信息都保存在一个地方。后者只是为了 C/C++ 程序员转向 Java 的利益才真正得到支持。
【讨论】:
没有区别。
引用Sun:
[]可以作为类型的一部分出现在声明的开头,或者作为特定变量的声明符的一部分,或者两者兼而有之,如下例所示:byte[] rowvector, colvector, matrix[];此声明等效于:
byte rowvector[], colvector[], matrix[][];
【讨论】:
没有区别。
我更喜欢type[] name 格式,很明显该变量是一个数组(不用四处寻找它是什么)。
编辑:
哦,等等,有区别(我忘记了,因为我一次从不声明多个变量):
int[] foo, bar; // both are arrays
int foo[], bar; // foo is an array, bar is an int.
【讨论】:
没有真正的区别;然而,
double[] items = new double[10];
是首选,因为它清楚地表明该类型是一个数组。
【讨论】:
最首选的选项是int[] a - 因为int[] 是类型,a 是名称。
(您的第二个选项与此相同,空间错位)
它们在功能上没有区别。
【讨论】:
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[][];
因此它们将产生完全相同的字节码。
【讨论】:
不,这些是一样的。不过
byte[] rowvector, colvector, matrix[];
相当于:
byte rowvector[], colvector[], matrix[][];
取自Java Specification。这意味着
int a[],b;
int[] a,b;
不一样。我不会推荐这些多重声明中的任何一个。最容易阅读的(可能)是:
int[] a;
int[] b;
【讨论】:
两种声明风格在功能上没有区别。两者都声明 int 数组。
但是int[] a 将类型信息放在一起并且更冗长,所以我更喜欢它。
【讨论】:
两者含义相同。但是,这些变体的存在也允许这样做:
int[] a, b[];
等同于:
int[] a;
int[][] b;
但是,这是一种糟糕的编码风格,永远不应该这样做。
【讨论】:
是的,完全一样。个人比较喜欢
int[] integers;
因为它让任何阅读您的代码的人都立即明白整数是一个 int 数组,而不是
int integers[];
这并不那么明显,特别是如果您在一行中有多个声明。但同样,它们是等价的,所以这取决于个人喜好。
查看this page on arrays in Java 了解更深入的示例。
【讨论】:
两者都可以。我建议选择一个并坚持下去。 (我做第二个)
【讨论】:
它们是相同的,但是这些语句之间有一个重要的区别:
// 1.
int regular, array[];
// 2.
int[] regular, array;
在 1.regular 只是一个 int,而 2.regular 和 array 都是 int 的数组。
因此,您的第二个陈述是首选,因为它更清楚。根据this tutorial on Oracle也劝阻第一种形式。
【讨论】:
虽然int integers[] 解决方案源于 C 语言(因此可以被认为是“正常”方法),但许多人发现int[] integers 更合乎逻辑,因为它不允许创建不同类型的变量(即 int 和 an数组)在一个声明中(与 C 样式声明相反)。
【讨论】:
它是另一种形式,是从C借来的,java是基于它的。
出于好奇,有三种方法可以在java中定义一个有效的main方法:
public static void main(String[] args)public static void main(String args[])public static void main(String... args)【讨论】:
public static void main ( String \u005B \u005D args ),这也是另一种变体。
String... param,是一个数组
, then why it is not possible to call a method like say someMethod (1, 2)` 如果将 someMethod 定义为 someMethod ( int[] numbers )。数组要求参数必须来自连续的内存位置,尽管varargs 将首先从提供的参数中创建一个数组。此外,varargs 只能是方法的最后一个参数,但数组并非如此。
meth(int... a) 可以称为meth(1, 2) 或meth(new int[] {1, 2})。 Varargs 是将第一个版本转换为第二个版本的语法糖。参数的实际(字节码)类型是数组类型。至于必须排在最后,如果您考虑一下,没有其他明智的选择。
两者同样有效。但是不鼓励使用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 方的教程。否则,您将面临学习不良做法的风险。
【讨论】:
来自section 10.2 of the Java Language Specification:
[] 可以作为类型的一部分出现在声明的开头,或者作为特定变量的声明符的一部分,或者两者兼而有之,如下例所示:
byte[] rowvector, colvector, matrix[];这个声明相当于:
byte rowvector[], colvector[], matrix[][];
就我个人而言,几乎所有我见过的 Java 代码都使用第一种形式,通过将有关变量的所有类型信息保存在一个地方更有意义。老实说,我希望第二种形式被禁止……但这就是生活……
幸运的是,我认为我曾经见过这个(有效的)代码:
String[] rectangular[] = new String[10][10];
【讨论】:
int[] a[]; 这样混合'n'匹配 - 这永远会不清楚;-)
在声明单个数组引用时,它们之间没有太大区别。所以下面的两个声明是一样的。
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
【讨论】:
如前所述,没有太大区别(如果每行只声明一个变量)。
请注意,SonarQube 将您的第二种情况视为轻微的代码异味:
数组指示符“[]”应该在类型上,而不是变量上 (squid:S1197)
数组指示符应始终位于类型上以获得更好的代码 可读性。否则,开发人员必须同时查看类型和 变量名来判断一个变量是否是一个数组。
不合规代码示例
int matrix[][]; // Noncompliant int[] matrix[]; // Noncompliant合规解决方案
int[][] matrix; // Compliant
【讨论】:
是的,有区别。
int[] a = 新的 int[100]; // 'a' 本身不是数组,数组存储为地址 在内存的其他地方,'a' 只保存那个地址
int b[] = 新的 int[100]; // 在创建像 cleary 这样的数组时,显示 'b' 是一个数组,它 是整数类型。
【讨论】:
a 和 b 都持有对数组的引用。