Главная » Статьи » Java » Java Ranger Basic

День 13/21
Arrays


Массивы в Java являются ссылочными типами, однако им по каким-то причинам не переопределили метод toString().
Если мы сначала объявляем, а потом инициализируем, нужно писать так:

int array1D;
array1D = new int {0, 1, 2, 3};

Но в Java можно одновременно объявлять и инициализировать массив, тогда можно не писать new int.

int array1D = {0, 1, 2, 3};

Это особенно удобно, когда мы делаем многомерные массивы:

int array2D = {{0, 1}, {2, 3}};

Иногда их еще для наглядности пишут в виде матрицы:

int array2D = {
{0, 1},
{2, 3},
};

После объявления массив не может расти, потому что с точки зрения программирования память имеет линейную адресацию. Есть байты с номерами от 0 до 8 миллиарда (например, если памяти 8 Гб). Когда нам нужна память, то подсистема памяти выделяет нам, например, 4 Мб и дает адрес первой ячейки, далее от которой 4 Мб – свободные. С точки зрения электроники реализации нашей памяти, данные в этих ячейках привязаны к элементной базе. Нельзя никак эти данные сдвинуть, потому что примитивные электрокомпоненты (транзисторы, диоды, конденсаторы и т.д.) находятся в каком-то состоянии и помнят, что в этих местах единица.
Ситуация очень похожа на выделение земельных участков. Если нужно увеличить кусок земли, когда слева и справа есть соседи, то это сделать невозможно.

Есть язык программирования D, это аналог C#. Вот у них можно увеличивать размеры массивов, но только если «сзади» у него пустое пространство. В ОЗУ нет системы дефрагментации.

В пакете java.util есть класс Arrays для работы с массивами. Но метод toString() у него работает только на одно измерение.
Поэтому в классе Arrays есть другой метод – deepToString(), который не ограничен в измерениях.

В JVM встроена функция System.arraycopy. Мы не знаем, как устроена эта функция, она идет без src, а реализована внутри JVM. Но у всех процессоров скопировать кусок памяти – достаточно типичная задача. А массивы – это прямо сырая память.
Поэтому во всех современных процессорах есть определенные комбинации наборов машинных инструкций, которые очень быстро копируют куски памяти. Из языков высокого уровня их не видно, поэтому абсолютное большинство языков высокого уровня имеют библиотечную функцию для копирования памяти.

System.arraycopy

Здесь как раз то место, где Java имеет преимущество над C, C++, Assembler. Поскольку, когда мы программируем под C или Assembler, нам нужно решить, под какой процессор (Intel или AMD) мы будем программировать, под какую модель и т.д. Если этого не указать, то загрузятся стандартные машинные инструкции, работающие под всеми процессорами. В итоге получается, что наш код неплохо будет работать на всех процессорах.
Если же мы используем виртуальную машину Java, то нужно использовать отдельно JVM под Linux, отдельно под Windows. Под Windows – отдельно под 32-битную ОС, отдельно под 64-битную ОС и т.д.

Таким образом достаточно часто оказывается, что Java на многих тестах опережает C, C++. Но если мы заранее будем знать тип процессора, размеры кэшей, то на каждой конкретной конфигурации, то C и C++ опережают Java. Проблема в том, что никто так не пишет. Современная JRE занимает около 30Мб и там наверняка условия под каждый тип процессора есть.
Поэтому System.arraycopy работает очень быстро. Преимущество перед копированием с помощью циклов достигает до 40 раз. Преимущество System.arraycopy еще и в том, что он будет работать даже если мы копируем из массива в тот же самый массив, в то же самое место.





В следующей теме мы рассмотрим: Dynamic Data Structures

Источник: http://becomejavasenior.com/courses/?utm_source=Java+Email+Courses&utm_campaign=aa710df388-JavaRangerBasicIntro&utm_medi
Категория: Java Ranger Basic | (06.10.2015) W
Просмотров: 382 | Теги: Basic, ranger, java | Рейтинг: 0.0/0
Всего комментариев: 0
avatar