Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.81/88: Рейтинг темы: голосов - 88, средняя оценка - 4.81
31 / 31 / 6
Регистрация: 11.07.2013
Сообщений: 241

Доступ к элементу массива

20.09.2013, 04:28. Показов 16379. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Такой вопрос: для одномерного массива на 100 элементов к какому из элементов быстрее произойдет обращение по индексу – к третьему или к предпоследнему и почему?

Добавлено через 1 час 52 минуты
еще: как можно посмотреть описание устройства массивов в java? (например, откуда берется свойство length)

Добавлено через 5 часов 6 минут
Еще чего не понимаю. Раз массив является ссылочным типом аля обьектом, то какого класса?

Добавлено через 12 минут
Цитата Сообщение от OxomHuK Посмотреть сообщение
еще: как можно посмотреть описание устройства массивов в java? (например, откуда берется свойство length)
Добавлено через 5 часов 6 минут
Еще чего не понимаю. Раз массив является ссылочным типом аля обьектом, то какого класса?

Вроде немного понял.

Массив является обьектом класса Array (не Arrays). Но этот класс конкретно так 'запечатан' (приватный конструктор и куча native методов)

Но все же, где быстрее обращение по индексу? или это нельзя узнать?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.09.2013, 04:28
Ответы с готовыми решениями:

Доступ к элементу объекта класса
Приветствую! Недавно начала изучать Java, появился следующий вопрос: предположим, мы создаем обертку для массива, например, класс...

Как получить доступ к элементу массива, который сам является элементом массива
Здравствуйте! Использую Delphi 6 Есть такой тип type firstArray = array of single; Далее я объявляю такую переменную ...

Доступ к элементу массива
Ребят, готовлюсь к зачету, не могу разобрать один вопрос: Доступ к элементу массива Вот есть у меня массив int mas; Можете...

11
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
20.09.2013, 12:05
Цитата Сообщение от OxomHuK Посмотреть сообщение
Массив является обьектом класса Array
неверно, массив это нативный объект
Java
1
2
3
4
5
6
public class Arr {
    public static void main(String[] args) {
        int [] a = new int[2];
        System.out.println(a.getClass().getName());
    }
}
доступ к любому элементу массива происходит с одинаковой скоростью, так как при этом
происходит такой алгоритм реализованный на С в нативках:
get <адрес_массива_в_памяти> + <индекс_массива> * <размер_типа_данных>

Не по теме:

возможно получение 0 элемента и обгоняет на пару тактов, но это всё )


класс Array это специальный класс для Reflection с нативными методами для реализации поведения как у объекта
примерно как у void
Java
1
2
        Class v = void.class;
        System.out.println(v.isPrimitive());
2
ɐwʎ ɔ vǝmоɔ dиw ɐʚонɔ
 Аватар для tankomaz
443 / 442 / 100
Регистрация: 14.10.2012
Сообщений: 1,146
Записей в блоге: 9
20.09.2013, 12:09
length это некая переменная (поле), которую вы пишите new int[100]
а время доступа, как мне кажется, к любому элементу будет одинаковое, ибо jvm четко понимает в какой области памяти какой номер
1
KeM6Pug}I{a
49 / 49 / 1
Регистрация: 23.08.2013
Сообщений: 202
21.09.2013, 22:36
Цитата Сообщение от mutagen Посмотреть сообщение
get <адрес_массива_в_памяти> + <индекс_массива> * <размер_типа_данных>
А как насчёт разрядности ОС?
Вот примерно ваш алгоритм:

C++
1
2
3
4
5
6
        const int size = 5;
 
    int mas [size] = {1,2,3,4,5};
 
    for(int i = 0; i < size; i++) 
        std::cout << *(mas + (i * sizeof(int))) << "\n";
Но работает он не корректно...
0
 Аватар для Venzo
127 / 125 / 16
Регистрация: 03.07.2011
Сообщений: 354
21.09.2013, 22:44
Цитата Сообщение от MbICJIuTeJIb_u3 Посмотреть сообщение
Но работает он не корректно...
потому что складывание указателей само по себе предполагает "умножение на размер типа указателя".
т.е если у вас указатель на int и вы к нему прибавите 1, то реально указатель увеличится на 4 (в 32х)
0
KeM6Pug}I{a
49 / 49 / 1
Регистрация: 23.08.2013
Сообщений: 202
21.09.2013, 22:54
Цитата Сообщение от Venzo Посмотреть сообщение
потому что складывание указателей само по себе предполагает "умножение на размер типа указателя".
т.е если у вас указатель на int и вы к нему прибавите 1, то реально указатель увеличится на 4 (в 32х)
C++
1
2
3
for(int i = 0; i < size; i++) 
        cout << *(mas + i) << "\n";
    */
Да это я знаю, я просто подставил под этот алгоритм:
get <адрес_массива_в_памяти> + <индекс_массива> * <размер_типа_данных>

Добавлено через 1 минуту
Цитата Сообщение от MbICJIuTeJIb_u3 Посмотреть сообщение
то реально указатель увеличится на 4 (в 32х)
В вот именно на 4 в (32х) а в 64х ? Поэтому разрядность ос тут тоже играет свою роль.
0
 Аватар для Venzo
127 / 125 / 16
Регистрация: 03.07.2011
Сообщений: 354
21.09.2013, 23:27
Цитата Сообщение от MbICJIuTeJIb_u3 Посмотреть сообщение
Поэтому разрядность ос тут тоже играет свою роль.
Цитата Сообщение от MbICJIuTeJIb_u3 Посмотреть сообщение
<размер_типа_данных>
хоть 16 разрядная, эта формула все равно подойдет)
0
127 / 131 / 11
Регистрация: 25.12.2011
Сообщений: 443
21.09.2013, 23:51
Цитата Сообщение от mutagen Посмотреть сообщение
доступ к любому элементу массива происходит с одинаковой скоростью
Вроде же это уже давно не так из-за того, что память в компьютерах устроена иерархически и оптимизировано работают только некоторые паттерны доступа к памяти. Например, если начать произвольно "скакать" по достаточно большому массиву, то это будет совсем другая скорость по сравнению с последовательным доступом к его элементам.
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
22.09.2013, 01:49
Цитата Сообщение от kamre Посмотреть сообщение
Вроде же это уже давно не так из-за того, что память в компьютерах устроена иерархически и оптимизировано работают только некоторые паттерны доступа к памяти. Например, если начать произвольно "скакать" по достаточно большому массиву, то это будет совсем другая скорость по сравнению с последовательным доступом к его элементам.
ОК - окунёмся маленько глубже )
1. Вы совершенно правы по поводу иерархичности памяти, если массив уложится в кеш процессора по своему размеру, то скакать по нему можно будет очень быстро, но если массив настолько велик что он не умещается в кеше проца полностью, то возникнут потери времени на доступ в достаточно медленное ОЗУ по сравнению с кешем.

2. То есть дело не в патернах, а в собственно железе на котором выполняются замеры, поэтому один и тот же код может показать разные результаты на разных системах.

3. последовательный доступ всегда быстрее так как не надо умножать <размер_типа_данных> на индeкс, нужно просто сместиться на 1 шаг вперёд по памяти, естественно операция инкремента указателя происходит быстрее чем умножение.

4. Ну и самое сложное - современные камни имеют предсказатель переходов, и от того насколько ваш алгоритм доступа к элементам массива прогнозируемый тоже зависит скорость, так как на камне с несколькими ядрами в случае удачного предсказания, результат будет готов ещё до того как он вам понадобится.
1
 Аватар для verylazy
462 / 462 / 71
Регистрация: 26.02.2013
Сообщений: 1,263
24.09.2013, 12:53
не давала мне эта тема...покоя и решил провести небольшой тест
Вот два примера, массив или лист размером 10 миллионов, но проходов по элементам в 10 раз больше.
Seed поставил одинаковый, что бы генерировало каждый раз одинаковые последовательности, это можно будет наблюдать по сумме чисел.
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import java.util.Random;
 
public class RandomTestArray {
 
    public static void main(String[] args) {
        long sum = 0;
        int size = 10_000_000;
        Random r = new Random(42); // засеваем_всегда_одинаково
        Integer[] arr = new Integer[size];
        for (int i = 0; i < size; i++) arr[i] = i;
        // банзай!!!
        long start = System.currentTimeMillis();
        for (int i = 0; i < size * 10; i++) {
            int t = r.nextInt(size);
            sum += arr[t].intValue();
        }
        System.out.println("sum=" + sum + "  время " + (System.currentTimeMillis() - start));
    }
}

Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import java.util.ArrayList;
import java.util.Random;
 
public class RandomTestList {
 
    public static void main(String[] args) {
        long sum = 0;
        int size = 10_000_000;
        Random r = new Random(42); // засеваем_всегда_одинаково
        ArrayList<Integer> arr = new ArrayList<Integer>(size);
        for (int i = 0; i < size; i++) arr.add(i);
        // банзай!!!
        long start = System.currentTimeMillis();
        for (int i = 0; i < size * 10; i++) {
            int t = r.nextInt(size);
            sum += arr.get(t).intValue();
        }
        System.out.println("sum=" + sum + "  время " + (System.currentTimeMillis() - start));
    }
}

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

ArrayList 20964 20758 20978 20931 21016
Array 20947 20603 20555 20689 20505

полагаю, время одинаковое потому что использовались объекты, а не примитивные типы, но я не знаю как заполнить ArrayList примитивами

Для ясности я в первом примере вместо Integer сделал массив int - время выполнения в 2 раза быстрее
Выводы оставляю сделать читателям.
Троллинг и конструктивная критика приветствуется.
0
KeM6Pug}I{a
49 / 49 / 1
Регистрация: 23.08.2013
Сообщений: 202
24.09.2013, 13:07
Не понимаю зачем сверять массивы и Список реализованный на динамически расширяющимся массиве?
Если вы зарание знаете размер , то следовательно нужно использовать массив.
0
 Аватар для verylazy
462 / 462 / 71
Регистрация: 26.02.2013
Сообщений: 1,263
24.09.2013, 13:27
если это массив не примитивных типов то нет разницы что использовать - список или массив, это видно из результата теста, ваш кэп

но мне просто захотелось сравнить, для себя, будет ли разница между ними или нет...вот, сравнил
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.09.2013, 13:27
Помогаю со студенческими работами здесь

Доступ к элементу массива структур
Есть массив из 6-ти структур. Нужно выбрать по возрасту самого старшего сотрудника и вывести его данные в MessageBox. Как это реализовать я...

Доступ к элементу массива по пути из строки
Делаю функцию, которая вытаскивает значение из массива по пути. Примеры пути: // user&gt;id, должно достать значение из $arr //...

Доступ к элементу массива по уникальному имени
Здравствуйте. Вроде программирую давно, но вот сегодня застрял... Есть простой класс: public class ColumnSettings ...

Возврат массива и доступ к определённому элементу
Никак не могу разобраться с этой темой Есть некоторый класс с массивом. Надо вернуть массив и обратится к конкретному элементу. Вот что...

Доступ к элементу массива через указатель
надо осушествить следуюшие: pointerArr=21; когда: main.cpp #include &lt;QtCore/QCoreApplication&gt; #include &quot;Array.h&quot; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 11.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru