какая максимальная длина массива java
Максимальный размер Java-массивов?
Есть ли ограничение на количество элементов, которые может содержать массив Java? Если так, то, что это?
10 ответов
Не видел правильного ответа, хотя это очень легко проверить.
Это (конечно) полностью зависит от VM.
На самом деле есть два ограничения. Во-первых, максимальный индексируемый элемент для массива и, во-вторых, объем памяти, доступной вашему приложению. В зависимости от объема доступной памяти и объема, используемого другими структурами данных, вы можете достичь предела памяти до того, как достигнете максимального адресуемого элемента массива.
Поддержка больших массивов также потребует изменений в JVM. Это ограничение проявляется в таких областях, как ограниченность коллекций 2 миллиардами элементов и невозможность отображения файлов памяти размером более 2 ГиБ. В Java также отсутствуют настоящие многомерные массивы (непрерывно выделенные отдельные блоки памяти, доступ к которым осуществляется одним косвенным обращением), что ограничивает производительность для научных и технических вычислений.
Я попытался создать такой массив байтов
С этой конфигурацией запуска:
Среда выполнения OpenJDK (сборка 1.8.0_141-b16)
64-разрядная серверная виртуальная машина OpenJDK (сборка 25.141-b16, смешанный режим)
Он работает только для x> = 2, что означает, что максимальный размер массива равен Integer.MAX_VALUE-2
Значения выше, которые дают
Исключение в потоке «main» java.lang.OutOfMemoryError: размер запрошенного массива превышает ограничение виртуальной машины на Main.main (Main.java:6)
Максимальное количество элементов array равно (2^31)−1 или 2 147 483 647
Да, есть ограничение на массив java. Java использует целое число в качестве индекса для массива, а максимальное целочисленное хранилище JVM составляет 2 ^ 32. так что вы можете хранить в массиве 2147483647 элементов.
На самом деле это ограничение Java, ограничивающее его 2 ^ 30-4, равным 1073741820. Не 2 ^ 31-1. Не знаю почему, но я тестировал его вручную на jdk. 2 ^ 30-3 все еще бросает виртуальную машину, кроме
Массив Java имеет ограничение, потому что это целочисленный массив, что означает, что он имеет до 2 147 483 647 элементов в массиве
Максимальный размер Java-массивов?
Есть ли ограничение на количество элементов, которые может содержать массив Java? Если так, то, что это?
Не нашел правильного ответа, хотя это очень легко проверить.
Это (конечно) полностью VM-зависимый.
который добавлен Мартином Бухгольцем (Google) 2010-05-09 ; проверено Крисом Хегарти (Oracle).
На самом деле есть два ограничения. Во-первых, максимальный индексируемый элемент для массива, а во-вторых, объем памяти, доступный для вашего приложения. В зависимости от объема доступной памяти и объема, используемого другими структурами данных, вы можете достичь предела памяти, прежде чем достигнете максимального адресуемого элемента массива.
Поддержка больших массивов также потребует изменений в JVM. Это ограничение проявляется в таких областях, как количество коллекций, ограниченное 2 миллиардами элементов, и невозможность хранения файлов карты размером более 2 ГиБ. В Java также отсутствуют настоящие многомерные массивы (непрерывно выделяемые отдельные блоки памяти, доступ к которым осуществляется по одной косвенной ссылке), что ограничивает производительность для научных и технических вычислений.
Я пытался создать байтовый массив, как это
С этой конфигурацией запуска:
Среда выполнения OpenJDK (сборка 1.8.0_141-b16)
64-битная серверная виртуальная машина OpenJDK (сборка 25.141-b16, смешанный режим)
Это работает только для x> = 2, что означает, что максимальный размер массива равен Integer.MAX_VALUE-2
Значения выше этого дают
Исключение в потоке «main» java.lang.OutOfMemoryError: Размер запрашиваемого массива превышает ограничение виртуальной машины в Main.main (Main.java:6)
Да, есть ограничение на массив Java. Java использует целое число в качестве индекса массива, а максимальное целочисленное хранилище JVM составляет 2 ^ 32. так что вы можете хранить 2 147 483 647 элементов в массиве.
Максимальный размер Java-массивов?
Есть ли ограничение на количество элементов, которые может содержать массив Java? Если да, то что это такое?
8 ответов
Не видел правильного ответа, хотя это очень легко проверить.
Это (конечно) полностью зависящее от VM.
который добавляет Мартин Буххольц (Google) в 2010-05-09; рассмотренный Крисом Хегарти (Oracle).
На самом деле существует два предела. Один, максимальный элемент, индексируемый для массива, и два, объем памяти, доступный вашему приложению. В зависимости от объема доступной памяти и количества, используемого другими структурами данных, вы можете достигнуть предела памяти до того, как достигнете максимального адресуемого элемента массива.
Массивы должны индексироваться значениями int. Попытка доступа к массиву компонент с длинным значением индекса приводит к ошибке времени компиляции.
Поддержка больших массивов также потребует изменений в JVM. Это ограничение проявляется в таких областях, как коллекции, ограниченные 2 миллиардами элементов, и невозможность хранения карт памяти размером более 2 гигабайт. Java также не имеет истинных многомерных массивов (смежных выделенных блоков памяти, к которым обращается одна косвенность), что ограничивает производительность для научных и технических вычислений.
Ответ на ваш вопрос. Вы можете выделить массив размера (максимальная доступная память/размер элемента массива).
Я попытался создать массив байтов, подобный этому
С этой конфигурацией запуска:
Рабочая среда OpenJDK (версия 1.8.0_141-b16)
64-разрядная виртуальная машина OpenJDK (построение 25.141-b16, смешанный режим)
Массивы
Содержание
Массивы в Java — это структура данных, которая хранит упорядоченные коллекции фиксированного размера элементов нужного типа. В Java массив используется для хранения коллекции данных, но часто бывает полезно думать о массиве как о совокупности переменных одного типа.
Данная статья ознакомит Вас как в Java объявить массив переменных, создать и обрабатывать массив с помощью индексированных переменных.
Объявление массива
Чтобы использовать массив в программе, необходимо объявить переменную для ссылки на массив, и Вы должны указать тип массива, который может ссылаться на переменную. Синтаксис для объявления переменной массива:
Примечание: стиль dataType[] arrayRefVar является предпочтительным. Стиль dataType arrayRefVar[] происходит из языка C/C++ и был принят в Java для C/C++-программистов.
Пример
Следующие фрагменты кода примеры использования данного синтаксиса:
Создание массива
В Java создать массив можно с помощью оператора new с помощью следующего синтаксиса:
Вышеуказанное объявление делает две вещи:
Объявление переменной, создание и присвоение переменной ссылки массива могут быть объединены в одном операторе, как показано ниже:
В качестве альтернативы массивы в Java можно создавать следующим образом:
Элементы массива доступны через индекс. Отсчет индексов ведется от 0; то есть они начинают от 0 и до arrayRefVar.length-1.
Пример
Следующий оператор объявляет массив переменных myList, создает массив из 10 элементов типа double и присваивает ссылку myList:
Изображение отображает массив myList. Здесь myList имеет десять значений double и индексы от 0 до 9.
Работа с массивами
При работе с элементами массива, часто используют цикл for или цикл foreach потому, что все элементы имеют одинаковый тип и известный размер.
Пример
Полный пример, показывающий, как создавать, инициализировать и обработать массив:
Получим следующий результат:
Цикл foreach
JDK 1.5 представила новый цикл for, известный как цикл foreach или расширенный цикл for, который позволяет последовательно пройти весь массив без использования индекса переменной.
Пример
Следующий код отображает все элементы в массиве myList:
Получим следующий результат:
Передача массива в метод
Также как можно передать значение примитивного типа в метод, можно также передать массив в метод. Например, следующий метод отображает элементы в int массиве:
Его можно вызвать путем передачи массива. Например, следующий оператор вызывает метод printArray для отображения 3, 1, 2, 6, 4 и 2:
Возврат массива из метода
Метод может также возвращать массив. Например, метод, показанный ниже, возвращает массив, который является реверсирование другого массива:
Методы для массива
Класс java.util.Arrays содержит различные статические методы для поиска, сортировки, сравнения и заполнения элементов массива. Методы перегружаются для всех примитивных типов.
№ | Описание |
1 | public static int binarySearch(Object[] a, Object key) Ищет заданный массив объектов (byte, int, double, и т.д.) для указанного значения, используя алгоритм двоичного поиска. Массив должен быть отсортирован до выполнения этого вызова. Это возвращает индекс ключа поиска, если он содержится в списке; в противном случае (-(точка вставки + 1). |
2 | public static boolean equals(long[] a, long[] a2) Возвращает значение true, если два указанных массивах равны друг другу. Два массива считаются равными, если оба массива содержат одинаковое количество элементов, и все соответствующие пары элементов в двух массивах равны. Такой же метод может быть использован всеми другими примитивными типами данных (byte, short, int и т.д.). |
3 | public static void fill(int[] a, int val) Присваивает определенное значение int к каждому элементу указанного целочисленного массива. Такой же метод может быть использован всеми другими примитивными типами данных (byte, short, int и т.д.). |
4 | public static void sort(Object[] a) Этот метод сортировки сортирует указанный массив объектов в порядке возрастания, в соответствии с естественным порядком его элементов. Такой же метод может быть использован всеми другими примитивными типами данных (byte, short, int и т.д.). |
Пример 1: создание, объявление переменных, определение (выделение памяти) и инициализация массива
В качестве примера возьмем тип данных int. Вы же можете использовать любой другой тип данных.
Пример 2: длина массива
Узнать размер массива в Java можно с помощью метода length(). Данный метод позволяет определить размерность массива.
Получим следующий результат:
Пример 3: максимальный элемент массива
Простые способы для того, чтобы найти максимальное число в массиве в Java. Сперва воспользуемся методом Math.max().
Получим следующий результат:
Ещё один пример нахождения максимального числа в массиве в Java. Здесь мы не будем использовать какие-либо методы.
Получим следующий результат:
Пример 4: минимальный элемент массива
Написанный ниже код практически ничем не отличается от кода, описанного в примере 3. Он в точности наоборот, просто здесь мы ищем минимальное число в массиве в Java. В первом способе воспользуемся методом Math.min().
Получим следующий результат:
Ещё один пример нахождения максимального числа в массиве в Java. Здесь мы не будем использовать какие-либо методы.
Получим следующий результат:
Пример 5: сумма массива
В этом примере рассмотрим как получить сумму элементов массива в Java.
Получим следующий результат:
А в этом примере используем улучшенный цикл for, чтобы найти сумму массива.
Получим следующий результат:
Пример 6: вывод массива
В данном примере рассмотрим как вывести массив на экран в Java.
Получим следующий результат:
Пример 7: вывод четных и нечетных элементов массива
В примере показано как вывести четные и нечетных элементы массива в Java.
Получим следующий результат:
Пример 8: вывод элементов массива с четным и нечетным индексом
В примере показано как вывести на экран элементы массива с четным и нечетным индексом.
Получим следующий результат:
Почему я не могу создать массив с большим размером?
почему невозможно создать массив с максимальным размером int?
Я нашел такое объяснение:
массивы Java доступны через 32-разрядные ints, в результате чего максимальный теоретический размер массива составляет 2147483647 элементов.
но как вы можете видеть, мой код не работает. Также невозможно создать массив с размером
технические детали
5 ответов
теория
возможны два исключения:
практика
полезное Ссылки
недостаточно просто иметь достаточно кучи для этого распределения; вам нужно иметь одну кучу края достаточного размера. Как вы знаете, куча делится на поколения.
некоторые VMs резервируют некоторые слова заголовка в массиве.
поэтому это зависит от максимальной памяти, доступной вашему JVM в вашей системе сейчас
Edit: почему он показывает OOM.
количество элементов = 2 147 483 639
количество байтов, необходимых для одного элемента = 4
общая память только для элемента 8589934556 КБ == 8.589934555999999 ГБ
таким образом, вам нужно больше, чем то, что вы выделяете из-за накладных расходов, и это должна быть непрерывная память
Ну, Иван уже правильно указал, что длина массива имеет хорошо определенный верхний предел и что он снова зависит от JVM/платформы. На самом деле, что более важно, он также заявил, что сколько длины массива вы можете фактически создать в своем коде, в основном будет контролироваться тем, сколько максимального пространства кучи вы выделили своей программе во время выполнения.
Я просто хотел бы добавить небольшой фрагмент кода, чтобы поддержать его объяснение. Например, теоретически, массив [] должен принимать length после Java-программа с опцией VM -Xmx32m тогда вы увидите, что ни один из созданных массивов не достигает длины, близкой к MAX_ARRAY_SIZE (т. е. 2147483639)
Byte[] массив : 1 байт
0 l=1048576 s=1 Мб
1 л=2097152 с=2 Мб
2 l=4194304 s=4 МБ
3 l=8388608 s=8 МБ
Ява.ленг.OutOfMemoryError: пространство кучи Java l=16777216 s=16mb
char[] массив: 2 байта
0 l=1048576 s=2 Мб
1 л=2097152 с=4 МБ
2 l=4194304 s=8 МБ
Ява.ленг.OutOfMemoryError: пространство кучи Java l=8388608 s=16mb
int[] массив: 4 байта
0 l=1048576 s=4 МБ
1 л=2097152 с=8 МБ
Ява.ленг.OutOfMemoryError: пространство кучи Java l=4194304 s=16 МБ
двойной[] массив : 8 байт
0 l=1048576 s=8 МБ
Ява.ленг.OutOfMemoryError: пространство кучи Java l=2097152 s=16mb
найдите максимальный размер кучи, перейдя в cmd и введите эту строку