powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Вставка в середину LinkedList медленнее чем ArrayList, почему?
21 сообщений из 21, страница 1 из 1
Вставка в середину LinkedList медленнее чем ArrayList, почему?
    #39522766
DevIgo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пробую вставку данных в середину списка, чтобы увидеть что ArrayList медленнее LinkedList при вставке в середину списка, но почему то получаю обратную ситуацию

Код: plaintext
1.
ArrayList add:  339994441
LinkedList add: 6284958197

Я что то не так делаю/прочел/понял про работу этих листов?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
	public static void main(String... args) {

		ArrayList<Integer> arrayList = new ArrayList<Integer>();
		LinkedList<Integer> linkedList = new LinkedList<Integer>();

		// ArrayList add
		long startTime = System.nanoTime();

		for (int i = 0; i < 100000; i++) {
			arrayList.add((int) i / 2, i);
		}
		long endTime = System.nanoTime();
		long duration = endTime - startTime;
		System.out.println("ArrayList add:  " + duration);

		// LinkedList add
		startTime = System.nanoTime();

		for (int i = 0; i < 100000; i++) {
			linkedList.add((int) i / 2, i);
		}
		endTime = System.nanoTime();
		duration = endTime - startTime;
		System.out.println("LinkedList add: " + duration);
	}
...
Рейтинг: 0 / 0
Вставка в середину LinkedList медленнее чем ArrayList, почему?
    #39522775
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DevIgo,

Вы померяли не только вставку но и поиск по индексу.
...
Рейтинг: 0 / 0
Вставка в середину LinkedList медленнее чем ArrayList, почему?
    #39522778
DevIgo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

Были у меня сомнения на этот счет, а как тогда может выглядеть вставка в середину листа без поиска?
...
Рейтинг: 0 / 0
Вставка в середину LinkedList медленнее чем ArrayList, почему?
    #39522784
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DevIgoBlazkowicz,

Были у меня сомнения на этот счет, а как тогда может выглядеть вставка в середину листа без поиска?
Ну, либо через рефлексию с LinkedList, чтобы достучаться до объекта Node, который включает в себя ссылки на соседей, либо свой связный список написать. Какая супер задача-то? Померять очевидное?
...
Рейтинг: 0 / 0
Вставка в середину LinkedList медленнее чем ArrayList, почему?
    #39522789
DevIgo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,
Реальной задачи нет, просто из вычитанного это декларируется как преимущество одного над другим, а получается в реальной жизни этим воспользоваться то нельзя)

Спасибо за пояснения
...
Рейтинг: 0 / 0
Вставка в середину LinkedList медленнее чем ArrayList, почему?
    #39522792
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DevIgoРеальной задачи нет, просто из вычитанного это декларируется как преимущество одного над другим,

Ну, с точки зрения структур данных, вам никто не мешает хранить ссылку на середину, тогда искать надобности не будет. Вы же не про Java Collection читаете?

DevIgoа получается в реальной жизни этим воспользоваться то нельзя)
Спасибо за пояснения
В реальной жизни есть ещё куча оптимизаций работы с массивами на всех возможных уровнях от GC и JIT до CPU, которые нивелируют даже теоретически возможное преимущество LinkedList.
...
Рейтинг: 0 / 0
Вставка в середину LinkedList медленнее чем ArrayList, почему?
    #39522798
Лысый дядька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DevIgoBlazkowicz,
Реальной задачи нет, просто из вычитанного это декларируется как преимущество одного над другим, а получается в реальной жизни этим воспользоваться то нельзя)

Спасибо за пояснения

Еще как можно. Допустим, у нас есть коллекция, нужно найти элемент с некоторым набором свойств и вставить объект после этого элемента. ArrayList и LinkedList дадут примерно одинаковое время поиска, но LinkedList выиграет на вставке.
...
Рейтинг: 0 / 0
Вставка в середину LinkedList медленнее чем ArrayList, почему?
    #39522810
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DevIgoЯ что то не так делаю/прочел/понял про работу этих листов?

1. Вы меряете не линейкой, а прыгающим мячиком. Т.е. резульаты вообще ни о чём. Надо использовать
jmh - например вот
YouTube Video
...
Рейтинг: 0 / 0
Вставка в середину LinkedList медленнее чем ArrayList, почему?
    #39522820
DevIgo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczНу, с точки зрения структур данных, вам никто не мешает хранить ссылку на середину, тогда искать надобности не будет. Вы же не про Java Collection читаете?

Да
BlazkowiczВ реальной жизни есть ещё куча оптимизаций работы с массивами на всех возможных уровнях от GC и JIT до CPU, которые нивелируют даже теоретически возможное преимущество LinkedList.
Интересно замечание)
...
Рейтинг: 0 / 0
Вставка в середину LinkedList медленнее чем ArrayList, почему?
    #39522822
DevIgo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Лысый дядькаЕще как можно. Допустим, у нас есть коллекция, нужно найти элемент с некоторым набором свойств и вставить объект после этого элемента. ArrayList и LinkedList дадут примерно одинаковое время поиска, но LinkedList выиграет на вставке.
Судя по моему тесту как раз таки в случае поиска и вставки ArrayList поиск и вставку делает быстрее, поэтому непонятно зачем именно при поиске и вставке будет использовать не ArrayList
...
Рейтинг: 0 / 0
Вставка в середину LinkedList медленнее чем ArrayList, почему?
    #39522824
DevIgo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, посмотрю
...
Рейтинг: 0 / 0
Вставка в середину LinkedList медленнее чем ArrayList, почему?
    #39522827
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DevIgoСудя по моему тесту как раз таки в случае поиска и вставки ArrayList поиск и вставку делает быстрее,
Вы забыли уточнение, если поиск идет по порядковому номеру элемента.
Для задачи вставить элемент со значением 4 после каждого элемента, значение которого равно 3. Могут всплыть ньюансы.

Правда ArrayList.ensureCapacity может опять все поменять, но в любом случае переносов данных будет больше.
...
Рейтинг: 0 / 0
Вставка в середину LinkedList медленнее чем ArrayList, почему?
    #39522885
Лысый дядька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
package com.company;

import java.util.*;
import java.util.function.Consumer;
import java.util.stream.IntStream;

public class Main {
    static List<Integer> arrayList = new ArrayList<>();
    static List<Integer> linkedList = new LinkedList<>();

    static Long arrayListTime = 0L;
    static Long linkedListTime = 0L;

    static void doIt(List<Integer> l, Consumer<Long> counterSaver){
        Long t1 = System.nanoTime();
        ListIterator<Integer> i = l.listIterator();
        while (i.hasNext()){
            Integer n = i.next();
            if(n == 500_000){
                IntStream.range(0, 1000).forEach(i::add);
                Long t2 = System.nanoTime();
                counterSaver.accept(t2 - t1);
                break;
            }
        }
    }

    static void fill(List<Integer> l){
        IntStream.range(0, 1_000_000).forEach(l::add);
    }



    public static void main(String[] args) {
        fill(arrayList);
        fill(linkedList);
        IntStream.range(0, 100).forEach((i)->
                {
                    doIt(arrayList, time -> arrayListTime += time);
                    doIt(linkedList, time -> linkedListTime += time);
                }
        );
        System.out.println("ArrayList = " + arrayListTime + " LinkedList = " + linkedListTime + " Total " + (arrayListTime - linkedListTime));
    }
}



На моей машине выгода очевидна
авторArrayList = 10695445356 LinkedList = 237158490 Total 10458286866
...
Рейтинг: 0 / 0
Вставка в середину LinkedList медленнее чем ArrayList, почему?
    #39523095
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Вставка в середину LinkedList медленнее чем ArrayList, почему?
    #39523152
just_vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DevIgo,
не помню где я услышал/прочитал про LinkedList, но вроде бы его автор Doug Lea как то признался, что ему ни разу не встретилось случая, когда потребовалось бы его использовать.

Alexey TominDevIgoЯ что то не так делаю/прочел/понял про работу этих листов?
1. Вы меряете не линейкой, а прыгающим мячиком. Т.е. резульаты вообще ни о чём. Надо использовать
jmh - например вот
YouTube Video
...
Рейтинг: 0 / 0
Вставка в середину LinkedList медленнее чем ArrayList, почему?
    #39523276
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
just_vladimirDevIgo,
не помню где я услышал/прочитал про LinkedList, но вроде бы его автор Doug Lea как то признался, что ему ни разу не встретилось случая, когда потребовалось бы его использовать.

https://twitter.com/joshbloch/status/583813919019573248
...
Рейтинг: 0 / 0
Вставка в середину LinkedList медленнее чем ArrayList, почему?
    #39524315
just_vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
llemingjust_vladimirDevIgo,
не помню где я услышал/прочитал про LinkedList, но вроде бы его автор Doug Lea как то признался, что ему ни разу не встретилось случая, когда потребовалось бы его использовать.

https://twitter.com/joshbloch/status/583813919019573248
Точно! А когда писал комментарий не мог найти правильное упоминание, потому что это был Джошуа Блох, а не Даг Ли ...
...
Рейтинг: 0 / 0
Вставка в середину LinkedList медленнее чем ArrayList, почему?
    #39524367
DevIgo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
llemingjust_vladimirDevIgo,
не помню где я услышал/прочитал про LinkedList, но вроде бы его автор Doug Lea как то признался, что ему ни разу не встретилось случая, когда потребовалось бы его использовать.

https://twitter.com/joshbloch/status/583813919019573248
Неожиданный поворот)
...
Рейтинг: 0 / 0
Вставка в середину LinkedList медленнее чем ArrayList, почему?
    #39524810
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczНу, либо через рефлексию с LinkedList, чтобы достучаться до объекта Node, который включает в себя ссылки на соседей, либо свой связный список написать. Какая супер задача-то? Померять очевидное?

Что за привычка предлагать плохие варианты не предложив при этом штатного? Послушает вас топикстартер - и подумает, что других способов нет.

На самом деле, вставка в середину списка без поиска делается через итератор - ListIterator.add(), один раз его получаем - и через него делаем все вставки. В этом случае, время вставки - это будет только время вставки. Только в вашем случае итератор еще передвигать каждый раз придется. Работать, наверное, будет быстрей, чем ваш вариант, но не факт, что быстрей ArrayList.

Связанный список быстр на вставку-удаление только при условии что уже есть итератор, который указывает куда надо. Если итератора нет - его надо или получать поиском, или получать сдвигом другого итератора (что является, по сути формой линейного поиска, в котором время прямо пропорционально кол-ву шагов) - и вот эти операции съедают много, и в подавляющем большинстве случаев ArrayList оказывается не хуже.
...
Рейтинг: 0 / 0
Вставка в середину LinkedList медленнее чем ArrayList, почему?
    #39524849
Лысый дядька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А никого не щекочет тестовый пример, который я выше дал?
...
Рейтинг: 0 / 0
Вставка в середину LinkedList медленнее чем ArrayList, почему?
    #39525004
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лысый дядька,

Так тут выбран оптимальный вариант для LinkedList и не оптимальный для ArrayList.

Если надо вставить N узлов в K точек. То для массива это делается не так. Один раз расширяем и потом сзади заполняем. Понятное дело N раз делать расширение с копированием всенго массива убъет все нафиг. А для связанного списка одлна пробежка и куча вставок самое милое дело.
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Вставка в середину LinkedList медленнее чем ArrayList, почему?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]