java - 为什么 java.util.Stack 不使用 LinkedList 的复合模式,而是使用 Vektor?

标签 java arrays data-structures stack

我试图理解这一点:

在java中,Stack扩展了Vector。没关系。这是一个同步实现。但是,并不总是需要同步,在这种情况下,建议使用 ArrayDeque。

但是如果 Stack 是使用 LinkedList 的复合模式构建的,不是会更好吗? LinkedList 为插入和删除提供了更好的性能。此外,数组的大小是固定的,每当您需要增加列表的大小时,您还需要重新分配一个新数组并将内容复制过来。 最后,使用 LinkedList,Stack 的实现可能比数组更简单、性能更高。

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();
    }
}

}

最佳答案

这个:

LinkedList provides better performance for inserting and deleting.

还有这个:

Finally, with LinkedList an implementation for Stack may be easier and more performant than array

不正确。

即使您考虑到这一点,它们仍然是不正确的:

Additionally, arrays are fixed in size, anytime you need to increase the size of the list, you also need to reallocate a new array and copy the contents over.

Stack 基于 Vector,因为它在速度和内存消耗方面都比链表更高效。

假设您将 100 万个项目推送到列表末尾/堆栈顶部。

总共执行了多少内存分配? vector :~20。链接列表:~1000000

修改了多少字节(与所用的剩余时间几乎成正比)? vector :~10MB。链接列表:~24MB

总内存消耗? vector :~4MB,链接列表:~16MB

关于java - 为什么 java.util.Stack 不使用 LinkedList 的复合模式,而是使用 Vektor?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58363959/

相关文章:

java - Java 线程 ID 应该总是从 0 开始吗​​?

java - 2个类之间有什么关系?

java - Payara 5 @JMSConnectionFactory 在使用@Stateless bean 时注入(inject)失败

c - 为什么我在编译时得到 "warning: function returns address of local variable [-Wreturn-local-addr]"?

java - 我如何保留 oauth token 以便将来可以使用它们?

c++ - 我正在为 CFD 3D 求解器编写代码,程序针对小尺寸的 3D 矩阵运行,但它显示大尺寸的段错误

关于删除链表最后一个节点的困惑

java - 为什么 getValue() 函数不适用于 HashMap?

c++ - 哈夫曼解码函数重复解压一个字符

c - 嵌套数组(6 维)的替代方案,内存间隙保留 O(1) 访问