Статьи

Массивы Java, Ват !?

Есть несколько вещей, которые вы можете сделать с массивами, которые удивляют.

Это массив или нет?

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 .