Почему java.util.Stack не использует составной шаблон с LinkedList вместо Vektor? - PullRequest
1 голос
/ 13 октября 2019

Я пытаюсь понять это:

В Java Stack расширяет Vector. Это нормально. Это синхронизированная реализация. Однако синхронизация не всегда необходима, в таких случаях рекомендуется использовать ArrayDeque.

Но если бы стек был построен с использованием составного шаблона с LinkedList,Разве это не было бы лучше? LinkedList обеспечивает лучшую производительность для вставки и удаления. Кроме того, массивы имеют фиксированный размер, в любое время, когда вам нужно увеличить размер списка, вам также необходимо перераспределить новый массив и скопировать содержимое. Наконец, с LinkedList реализация для стека может быть проще и более производительной, чем массив.

public class ListStack implements Stack {

private final List _list = new LinkedList();

public void push(Object value) {
    _list.add(value);
}

public Object pop() throws EmptyStackException {
    if(isEmpty()) {
        throw new EmptyStackException();
    }
    return _list.delete(_list.size() - 1);
}

public Object peek() throws EmptyStackException {
    Object result = pop();
    push(result);
    return result;
}


public void clear() {
     _list.clear();
}

public int size() {
    return _list.size();
}

public boolean isEmpty() {
    return _list.isEmpty();
}

public void enqueue(Object value) {
      push(value);
}

public Object dequeue() throws EmptyQueueException {
    try {
        return pop();
    }catch (EmptyStackException ex) {
        throw new EmptyStackException();
    }
}

}

1 Ответ

2 голосов
/ 13 октября 2019

Это:

LinkedList обеспечивает лучшую производительность для вставки и удаления.

И это:

Наконец, реализация LinkedListдля стека может быть проще и производительнее, чем массивы

неверны.

Они по-прежнему неверны, даже если учесть это:

Кроме того,Размеры массивов фиксированы, в любое время, когда вам нужно увеличить размер списка, вам также нужно перераспределить новый массив и скопировать содержимое.

Стек основан на Vector, потому что этоболее эффективен, чем связанный список, с точки зрения как скорости, так и потребления памяти.

Допустим, вы помещаете 1 миллион элементов в конец списка / верхнюю часть стека.

Сколько выделений памятивыполняются все вместе? Вектор: ~ 20. LinkedList: ~ 1000000

Сколько байтов модифицировано (в значительной степени пропорционально оставшемуся времени)? Вектор: ~ 10 МБ. LinkedList: ~ 24 МБ

Общее потребление памяти? Вектор: ~ 4 МБ, LinkedList: ~ 16 МБ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...