Разница между массивом int [] и массивом int []

Недавно я подумал о разнице между двумя способами определения массива:

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

Есть разница?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
242
0
82 327
25
Перейти к ответу Данный вопрос помечен как решенный

Ответы 25

Ответ принят как подходящий

Они семантически идентичны. Синтаксис int array[] был добавлен только для того, чтобы помочь программистам на C привыкнуть к java.

int[] array намного предпочтительнее и менее запутан.

[] Является частью ТИПА, а не ИМЕНИ. Для меня это самая большая разница.

André Chalella 25.09.2008 02:50

@Andre - а в C - [] его часть декларатора, а не спецификатора объявления, отсюда и синтаксис int array[]. Тоже логично ... в некотором роде. :)

Kos 08.12.2010 19:08

Си играет в эту маленькую игру :) И я нахожу это очаровательным :) Даже с подобными ... указателями. «Правильный» синтаксис c для указателей - int * imAPointer. Это глупо и аккуратно.

ScarletAmaranth 01.12.2011 02:08

Для меня int array[] имеет больше смысла. Что вы думаете об этом заявлении? int[] x, y? y - это массив или нет? Может быть, а может и нет. Только гуру Java могут ответить с уверенностью ....

user1508893 18.02.2013 08:12

В случае int[] x, yy является массивом (поскольку [] принадлежит типу), а в случае int x[], yy не является массивом ([] принадлежит переменной).

Triang3l 07.07.2013 20:49

@ScarletAmaranth Нет. С помощью C и указателей / * символ * может быть смежным либо с типом, либо с переменной (а не только с переменной, как вы, кажется, утверждаете). В C вы можете сказать int*imAPointer или int* imAPointer И в C, где вы можете сказать, что char *a и char* a оба верны ... потому что с char *aa имеет тип char. А с char* a a имеет тип char. Хотя на самом деле в C с массивами у вас есть только квадратные скобки после имени переменной. На Яве тоже. А в C# только после типа.

barlop 21.02.2016 04:56

Есть ли способ объявить несколько массивов одного размера и типа (как это сделано здесь с помощью java) в C? например: int[10] a, b; будет означать целочисленные массивы a и b размером 10 каждый.

J...S 18.02.2017 20:59

Я признаю, что это немного устаревшая тема, но я хочу сказать, что я не уверен в C, но я считаю, что этот ответ просто неверен в случае Java. Да, в большинстве случаев int[] arr; и int arr[] могут использоваться как взаимозаменяемые, но это не совсем одно и то же. Я отвечаю на этот вопрос здесь, откуда я видел ссылку на этот ответ .. что, опять же, я считаю не совсем верным.

Giorgi Tsiklauri 25.09.2020 15:34

В Java это просто разные синтаксические методы выражения одного и того же.

Они такие же. Один из них более читабелен (для некоторых), чем другой.

Они полностью эквивалентны. int [] array - предпочтительный стиль. int array[] предоставляется как эквивалент C-совместимого стиля.

Нет никакой разницы, но Sun рекомендует поставить его рядом с типом, как объяснено здесь

Две команды - это одно и то же.

Вы можете использовать синтаксис для объявления нескольких объектов:

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.

Между ними нет никакой разницы; оба объявляют массив int. Однако первый предпочтительнее, поскольку он хранит информацию о типе в одном месте. Последнее реально поддерживается только для программистов C / C++, переходящих на 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[][];

Нет никакой разницы.

Я предпочитаю формат type[] name, поскольку ясно, что переменная является массивом (меньше оглядывайтесь, чтобы узнать, что это такое).

Обновлено:

Ой, подождите, есть разница (я забыл, потому что я никогда не объявляю более одной переменной за раз):

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

Нет никакой реальной разницы; тем не мение,

double[] items = new double[10];

является предпочтительным, поскольку он ясно указывает на то, что тип является массивом.

double items [] действительно существует для программистов на C

Steve Kuo 25.02.2009 23:03

@ Стив, должно быть, поэтому я продолжаю так делать. :-)

Paul Tomblin 25.02.2009 23:04

Можно привести контраргумент, что double items [] четко указывает тип, а затем, что items оказывается массивом - все зависит от того, что вам удобно.

MetroidFan2002 01.03.2009 09:02

Наиболее предпочтительный вариант - int[] a, потому что int[] - это тип, а a - имя. (ваш второй вариант такой же, с неуместным пространством)

Функционально разницы между ними нет.

Спецификация языка 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[][];

Таким образом, они приведут к одному и тому же байтовому коду.

Нет, это одно и то же. тем не мение

byte[] rowvector, colvector, matrix[];

эквивалентно:

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

Взято из Спецификация Java. Что означает, что

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

разные. Я бы не рекомендовал ни одно из этих многочисленных заявлений. Легче всего (вероятно) читать:

int[] a;
int[] b;

Однако рекомендуется использовать одно объявление для каждого идентификатора вместо объявления нескольких идентификаторов в одной строке.

rsp 02.10.2010 18:34

@rsp - Полностью согласен, отредактировал лучшую практику. Тем не менее, это наводит на мысль, что это хорошая практика.

Ishtar 02.10.2010 18:55

Нет никакой разницы в функциональности между обоими стилями объявления. Оба объявляют массив int.

Но int[] a хранит информацию о типах вместе и более подробный, поэтому я предпочитаю его.

Оба имеют одинаковое значение. Однако наличие этих вариантов также позволяет:

int[] a, b[];

что то же самое, что:

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

Однако это ужасный стиль кодирования, и его никогда не следует делать.

вы хотите сказать, int [] a, b []; b становится многомерным массивом

sadananda salam 02.10.2010 18:31

Ага, точно так же. Лично я предпочитаю

int[] integers; 

потому что это делает очевидным для всех, кто читает ваш код, что целые числа представляют собой массив int, а не

int integers[];

что не делает все это очевидным, особенно если у вас есть несколько объявлений в одной строке. Но опять же, они эквивалентны, так что все сводится к личным предпочтениям.

Ознакомьтесь с эта страница о массивах в Java для более подробных примеров.

Оба в порядке. Я предлагаю выбрать один и придерживаться его. (Я делаю вторую)

Они одинаковы, но между этими утверждениями есть важное различие:

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

в 1. regular - это просто int, в отличие от 2. где и regular, и array являются массивами int.

Поэтому второе утверждение, которое у вас есть, предпочтительнее, поскольку оно более ясное. Первая форма также не рекомендуется согласно это руководство по Oracle.

Спасибо всем! Я выберу второй и буду придерживаться его.

Espen 24.10.2010 14:16

Хотя решение int integers[] основано на языке C (и поэтому может считаться «нормальным» подходом), многие люди считают int[] integers более логичным, поскольку он не позволяет создавать переменные разных типов (например, int и массив) в одном объявлении (как в отличие от декларации в стиле C).

Это альтернативная форма, заимствованная из C, на которой основана java.

Как любопытство, существуют способы три для определения действительного метода main в java:

  • 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 ), это тоже еще один вариант.

nIcE cOw 30.05.2015 05:45

@nIcEcOw параметр varargs, например String... param, является массив

Bohemian 30.05.2015 09:34

Возникает простое сомнение, если оба являются массивами, то есть String [] и String ... , then why it is not possible to call a method like say someMethod (1, 2) `, если кто-то определяет someMethod как someMethod ( int[] numbers ). Массивы требуют, чтобы аргумент был из непрерывной области памяти, хотя varargs сначала создаст массив из предоставленных аргументов. Более того, varargs может быть только последним аргументом метода, чего нельзя сказать о массиве.

nIcE cOw 30.05.2015 13:33

@nIcEcOw, но вы можете вызывать varargs с массивом, т.е. meth(int... a) может называться как meth(1, 2), так и meth(new int[] {1, 2}). Varargs - это синтаксический сахар, который превращает первую версию во вторую. Фактический (байт-код) тип параметра - это тип массива. Что касается необходимости быть последним, если подумать, другого разумного выбора нет.

Bohemian 30.05.2015 20:56

Оба одинаково действительны. Однако форма int puzzle[] не рекомендуется, int[] puzzle предпочтительнее в соответствии с соглашения о кодировании. См. Также официальный Руководство по массивам Java:

Similarly, you can declare arrays of other types:

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

You can also place the square brackets after the array's name:

float anArrayOfFloats[]; // this form is discouraged

However, convention discourages this form; the brackets identify the array type and should appear with the type designation.

Обратите внимание на последний абзац.

Я рекомендую читать официальные руководства Sun / Oracle, а не некоторые сторонние. В противном случае вы рискуете изучить плохие практики.

От раздел 10.2 Спецификации языка 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[][];

Лично я почти все код Java, который я когда-либо видел, использует первую форму, что имеет больше смысла, поскольку вся информация о типе переменной хранится в одном месте. Если честно, мне бы не разрешили вторые формы ... но такова жизнь ...

К счастью, я не думаю, что Когда-либо видел этот (действительный) код:

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

Спасибо, я ломал голову над этим. Как ни странно, когда погуглил заголовок вопроса, я ничего не нашел ...

Yoav 23.09.2011 02:10

+1 Я согласен с запретом второй формы. +1 тоже, потому что я не понимал, что вы можете смешивать 'n' совпадений, таких как int[] a[]; - это никогда будет непонятно ;-)

Bohemian 23.09.2011 02:23

при объявлении единственной ссылки на массив между ними нет большой разницы. поэтому следующие два объявления одинаковы.

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 рассматривает ваш второй случай как незначительный запах кода:

Array designators "[]" should be on the type, not the variable (squid:S1197)

Array designators should always be located on the type for better code readability. Otherwise, developers must look both at the type and the variable name to know whether or not a variable is an array.

Noncompliant Code Example

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

Compliant Solution

int[][] matrix;   // Compliant

Другие вопросы по теме