int []配列とint array []の違い


234

私は最近、配列を定義する2つの方法の違いについて考えています。

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

違いはありますか?

回答:


282

それらは意味的に同一です。int array[]構文はJavaだけに慣れるヘルプCプログラマに追加されました。

int[] array はるかに望ましいですが、混乱が少なくなります。


55
[]はNAMEではなくTYPEの一部です。私にとっては、それが最大の違いです。
アンドレ・Chalella

4
@Andre-Cでは、[]は宣言子ではなく宣言子の一部であり、したがってint array[]構文です。また、論理的...ねじれた方法で。:)
Kos

1
Cはこの小さなゲームをプレイします:)そして、私はそれを魅力的だと思います:) like ...ポインタを使用しても。ポインターの「正しい」c構文はint * imAPointerです。それは愚かで端正です。
ScarletAmaranth 2011年

4
int array[]私にはもっと理にかなっています。この宣言についてどう思いますか?int[] x, y?あるy配列かどうか?多分そうです、そうでないかもしれません。Javaの教祖だけが自信を持って答えることができます...
user1508893

24
の場合int[] x, yyは配列([]タイプに属するため)であり、の場合、配列int x[], yyはありません([]変数に属します)。
Triang3l 2013

172

たまたま同じ宣言で複数の変数を宣言する場合、わずかな違いが1つあります。

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仕様から取得。つまり

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

異なっています。これらの複数の宣言のいずれもお勧めしません。最も読みやすいのは(おそらく)次のようになります:

int[] a;
int[] b;

3
ただし、1行で複数の識別子を宣言するのではなく、識別子ごとに1つの宣言を使用することをお勧めします。
rsp

@rsp-完全に同意し、ベストプラクティスを編集しました。それでも、グッドプラクティスとは何かを示唆しています。
イシュタール

25

Java言語仕様のセクション10.2から:

[]は、次の例のように、宣言の最初の型の一部として、または特定の変数の宣言子の一部として、あるいはその両方として表示されます。

 byte[] rowvector, colvector, matrix[];

この宣言は次と同等です。

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

個人的に私が今まで見たほとんどすべてのJavaコードは最初の形式を使用します。これは、変数に関するすべての型情報を1か所に保持することにより、より意味があります。正直に言って、2番目の形式が許可されていないことを願っています...しかし、それは人生です...

幸い私は、私がきたとは思わない今までにこの(有効な)コードを見て:

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

おかげで、私はこれに頭を悩ませていました。不思議なことに、質問のタイトルをググるときに何も見つかりませんでした...
Yoav

3
+1 2番目のフォームを許可しないことに同意します。1あまりにも私はあなたが混在可能性が実現「n」のように一致しなかったためint[] a[];だ- 決して不明瞭になるだろうありません;-)
ボヘミアン


13

変わりはない。

Sunからの引用:

この例の[]ように、宣言の最初の型の一部として、または特定の変数の宣言子の一部として、あるいはその両方として表示される場合があります。byte[] rowvector, colvector, matrix[];

この宣言は次と同等です。 byte rowvector[], colvector[], matrix[][];


11

2つの間に違いはありません。どちらもintsの配列を宣言します。ただし、タイプ情報をすべて1か所に保持するため、前者の方が適しています。後者は、Javaに移行するC / C ++プログラマーの利益のためにのみ実際にサポートされます。


11

実際の違いはありません。しかしながら、

double[] items = new double[10];

タイプが配列であることを明確に示すため、


1
double items []はCプログラマーのために本当にあります
スティーブクオ

@Steve、そういうわけで私はそうし続けています。:-)
ポールトンブリン

double items []がタイプを明確に示し、後でたまたま配列が偶然であることを反論することができます-それはすべてあなたが快適に何に依存するかです。
MetroidFan2002 2009年

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

これは、CJavaのベースとなっているから借用した代替形式です。

好奇心として、Javaで有効なメソッドを定義するには3つの方法がありますmain

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

1
敬意をもって、しかしこの答えは質問です!!!!! 3番目のフォームは指定されていますが、実際には何もする必要があり、元の投稿で要求されているものを使用します。最初の2つの引数はメインメソッドへの配列ですが、3番目のエンティティは可変引数です(配列とは異なります)。mainメソッドの定義が問題である場合、別のフォームを追加してmainメソッドを定義することpublic static void main ( String \u005B \u005D args )もできます。これも別のバリアントです。
nIcE COW 2015年

2
例えばパラメータを、可変引数@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配列の場合は同じではありませんが、aはメソッドの最後の引数にしかなりません。
nIcE COW 2015年

2
@nIcEcOwただし、配列を使用して可変引数を呼び出すことができます。つまりmeth(int... a)meth(1, 2)またはとして呼び出すことができますmeth(new int[] {1, 2})。Varargsは、最初のバージョンを2番目のバージョンに変換する構文糖です。パラメータの実際の(バイトコード)型は配列型です。最後でなければならないことについては、考えてみれば他に正解はありません。
ボヘミアン


3

最も好ましいオプションはint[] a-であるのでint[]a、名前です。(あなたの2番目のオプションはこれと同じですが、スペースが間違っています)

機能的には両者に違いはありません。


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[] a, b[];

これは次と同じです:

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

ただし、これは恐ろしいコーディングスタイルであり、絶対に行わないでください。


つまり、int [] a、b []; bは多次元配列になります
sadananda salam

2

宣言の両方のスタイルの機能に違いはありません。どちらもintの配列を宣言します。

しかしint[] a 、タイプ情報をまとめて保持し、より冗長なので、私はそれを好みます。


2

それらは同じですが、これらのステートメントには重要な違いがあります。

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

in 1. regularは単なるintです。2。regularとarrayはどちらもintの配列です。

したがって、2番目のステートメントの方がより明確であるため、優先されます。最初のフォームも、このOracleのチュートリアルでは推奨されていません。


ありがとう!私は2番目のものに行き、それに固執します。
Espen、

2

すでに述べたように、大きな違いはありません(1行に1つの変数しか宣言しない場合)。

注意SonarQubeはマイナーのよう2番目のケースを扱うコードのにおい:

配列指定子「[]」は、変数ではなく型にある必要があります(squid:S1197)

コードを読みやすくするために、配列指定子は常に型に配置する必要があります。そうでない場合、開発者は型と変数名の両方を調べて、変数が配列であるかどうかを知る必要があります。

違反コード

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

準拠ソリューション

int[][] matrix;   // Compliant

1

うん、まったく同じ。個人的には

int[] integers; 

それはあなたのコードを読んでいる人に整数が整数の配列であることとは対照的に

int integers[];

これは、特に1行に複数の宣言がある場合は、それほど明白ではありません。しかし、繰り返しになりますが、それらは同等であるため、個人の好みに帰着します。

詳細な例については、Javaの配列に関するこのページをご覧ください


1

単一の配列参照を宣言する場合、それらの間に大きな違いはありません。したがって、次の2つの宣言は同じです。

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

複数の配列参照を宣言すると、それらの違いを見つけることができます。次の2つのステートメントは同じ意味です。実際、フォローしているのはプログラマ次第です。ただし、標準のJava表記をお勧めします。

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

0

どちらも大丈夫です。私はそれを選んでそれを使い続けることを勧めます。(私は2番目のものをします)


0

一方でint integers[]、C言語でのソリューションの根(したがって、「正常な」アプローチとみなすことができる)、多くの人が見つけint[] integers、それは、異なるタイプの変数を作成するには許可しないように、より論理的な(つまり、int型と配列)とは対照的に、1つの宣言(中Cスタイルの宣言)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.