int []数组和int array []之间的区别


234

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

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

有区别吗?

Answers:


281

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

int[] array 更可取,并且不会造成混乱。


55
[]是TYPE的一部分,而不是NAME的一部分。对我来说,这是最大的不同。
安德烈Chalella

4
@Andre-在C中,它是声明符的一部分,而不是声明说明符,因此是int array[]语法。同样合乎逻辑...以某种扭曲的方式。:)
Kos 2010年

1
C玩这个小游戏:)我发现它很迷人:)即使有...指针也是如此。指针的“正确” c语法为int * imAPointer。傻又整洁。
ScarletAmaranth 2011年

4
int array[]对我来说更有意义。您如何看待这个声明?int[] x, y?是y不是数组?也许是,也许不是。只有Java的大师们可以自信地回答....
user1508893

24
在的情况下int[] x, yy是一个数组(因为[]属于类型),在的情况下int x[], yy不是数组([]属于变量)。
Triang3l

171

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

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


52

没有区别。

我更喜欢type[] name格式是很清楚的,该变量是一个数组(不要四处看看它是什么)。

编辑:

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

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

27

不,这些都是一样的。然而

byte[] rowvector, colvector, matrix[];

等效于:

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

取自Java Specification。那意味着

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

是不同的。我不建议使用这些多个声明中的任何一个。最容易阅读的可能是:

int[] a;
int[] b;

3
但是,优良作法是每个标识符使用一个声明,而不是在一行中声明多个标识符。
rsp 2010年

@rsp-完全同意,编辑了最佳实践。但是,这仍然是好的实践。
伊什塔尔2010年

25

Java语言规范的10.2节开始

[]可能会在声明的开头作为类型的一部分出现,或在特定变量的声明器中出现,或者两者都出现,如本例所示:

 byte[] rowvector, colvector, matrix[];

该声明等效于:

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

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

幸运的是,我认为我从未见过以下(有效)代码:

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

谢谢,我为此挠头。奇怪的是,当谷歌搜索问题的标题时,我什么也没发现……
Yoav

3
+1我同意不允许使用第二种形式。也是+1,因为我没有意识到您可以像这样混合'n'比赛int[] a[];- 永远不会不清楚;-)
波西米亚


13

没有不同。

太阳报价:

[]可能显示为在声明的开头所述类型的部分,或作为说明符用于特定变量,或两者的一部分,如在这个例子中:byte[] rowvector, colvector, matrix[];

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


11

两者之间没有任何区别。都声明ints 的数组。但是,前者是首选,因为它会将类型信息全部保留在一个地方。仅出于C / C ++程序员向Java迁移的利益才真正支持后者。



7

两者同等有效。int puzzle[]但是不建议使用该形式,int[] puzzle根据编码约定,最好使用。另请参见官方Java数组教程

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

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

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

float anArrayOfFloats[]; // this form is discouraged

然而,惯例不鼓励这种形式。方括号标识阵列类型,并应与类型名称一起出现。

注意最后一段。

我建议阅读官方的Sun / Oracle教程,而不是一些第三方的教程。否则您将冒着学习不良做法的风险。


6

这是另一种形式,是从 C java所基于的。

出于好奇,可以使用以下三种main方法在Java中定义有效方法:

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

1
敬请谅解,但这是问题的答案!!!!是指定的第三种形式,实际上必须执行任何操作,并与原始帖子中要求的内容相同。前两个参数是main方法的数组,尽管第三个实体是变量参数(与array不同)。如果定义主方法是问题,那么也可以添加另一种形式来定义主方法,例如public static void main ( String \u005B \u005D args ),这也是另一种变体。
2015年

2
@nIcEcOw varargs参数,例如String... param一个数组
波西米亚式

如果这两个都是数组,则会出现一个简单的疑问,即String []和String ... , then why it is not possible to call a method like say someMethod(1,2)`(如果将其定义someMethod为)someMethod ( int[] numbers )。数组要求参数必须来自连续的内存位置,尽管varargs,该参数将首先从提供的参数中生成数组。此外,a varargs只能是方法的最终参数,尽管对于数组而言并非如此。
2015年

2
@nIcEcOw,但是您可以使用数组调用varargs,即meth(int... a)可以称为meth(1, 2)meth(new int[] {1, 2})。Varargs是一种语法糖,它将第一个版本转换为第二个版本。参数的实际(字节码)类型是数组类型。至于必须倒数第二,如果您考虑一下,别无选择。
波希米亚


3

最优选的选项是int[] a-,因为int[]是类型,而且a是名称。(您的第二个选项与此相同,但位置错误)

在功能上它们之间没有区别。


3

Java语言规范说:

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[][];

因此,它们将导致完全相同的字节码。



2

他们是一样的。(对某些人而言)一种更具可读性。


2

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



2

两种声明样式在功能上没有区别。两者都声明一个int数组。

但是int[] a 将类型信息保持在一起并且更加详细,所以我更喜欢它。


2

它们是相同的,但是这些语句之间存在重要区别:

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

在1.常规中只是一个int,而不是2.在常规和array都是int的数组中。

因此,您的第二条陈述是更可取的,因为它更清晰。根据有关Oracle的本教程,也不建议使用第一种形式。


谢谢大家!我将继续学习第二个并坚持下去。
Espen

2

如前所述,两者之间没有太大区别(如果每行仅声明一个变量)。

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

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

数组指示符应始终位于类型上,以提高代码的可读性。否则,开发人员必须同时查看类型和变量名称,以了解变量是否为数组。

不兼容的代码示例

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

合规解决方案

int[][] matrix;   // Compliant

1

是的,完全一样。就个人而言,我更喜欢

int[] integers; 

因为它使所有阅读您的代码的人都立即知道整数是一个int数组,而不是

int integers[];

这并没有那么明显,特别是如果一行中有多个声明。但是,它们又是等效的,因此归结为个人喜好。

在Java数组上查看此页面,以获取更多深入的示例。


1

声明单个数组引用时,它们之间没有太大区别。因此以下两个声明是相同的。

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

0

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


0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.