Есть несколько вещей, которые вы можете сделать с массивами, которые удивляют.
Это массив или нет?
1
|
Serializable array = new Serializable[ 9 ]; |
Массив — это массив или скаляр? Ну, это скаляр, который указывает на массив. Как
1
|
Object o = new Object[ 9 ]; |
Вы можете назначить массив объекту, потому что он также является объектом. Однако массивы также можно сериализовать, поэтому вы можете назначить их сериализуемым.
Куда мой [] пошел?
[] Может появляться в удивительных местах. Это компилируется по причинам обратной сопоставимости.
1
2
3
|
public static int method( int []... args)[] { return args[ 0 ]; } |
И типы здесь; args — это int [] [], а тип возвращаемого значения — int []. Вы заметили [] после объявления метода! Это не является частью JLS, и OpenJDK позволяет это по причинам обратной совместимости.
В чем разница между массивом int [] и массивом int [] ?
Есть разница в том, что последует за этим.
1
|
int [] array, x[]; |
и
1
|
int array[], y[]; |
В этих случаях; x является целым [] [], но y является только целым [] .
Что происходит, если инициализация массива слишком велика?
Скажем, я инициализирую массив, как это
1
2
3
4
5
|
public static final int [] VALUES = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 , 17 , 18 , 19 , 20 , /* many, many lines deleted */ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 , 17 , 18 , 19 , 20 , }; |
Сообщение об ошибке:
1
|
Error:( 6 , 31 ) java: code too large |
Это кажется немного странным. Не жалуется, что массив слишком большой. Фактически, если у меня будет больше статических полей или я использую большие константы, это приведет к ошибке для меньшего массива
Это происходит потому, что массивы инициализируются в байтовом коде. Там байт-код создает массив и инициализирует каждое значение, по одному за раз. Это приводит к большому количеству кода для больших массивов, что было бы такой проблемой, если бы не было ограничения в размере метода. т.е. 65535 байт. Компилятор генерирует один и только один метод для конструктора или статической инициализации, поэтому это ограничивает количество перечислений, которые вы можете иметь, и размер ваших инициализированных массивов.
Ссылка: | Массивы Java, Ват !? от нашего партнера JCG Питера Лоури из блога Vanilla Java . |