开发者社区> 问答> 正文

为什么java.util里的Stack不用LinkedList实现

thinking in java用LinkedList实现了stack,而且说比java.util 里自带的stack更好,那么为什么java.util里的stack不用LinkedList实现呢?

展开
收起
蛮大人123 2016-06-13 15:53:17 4764 0
2 条回答
写回答
取消 提交回答
  • 当人们发现可以用LinkedList取代性能不佳的Stack后,Stack就被弱化了,没人觉得没有Stack活不了(或者是多大问题)。
    另一方面,JDK要向后兼容,原来已存在的类不会被移除掉,那这个不被人们重视的喜爱的Stack就依然存在。
    当然,你可以实现高性能的Stack提交到官方,保持跟原来的方法和行为一致就可以了。

    2019-07-17 19:36:16
    赞同 展开评论 打赏
  • 我说我不帅他们就打我,还说我虚伪

    stack是线程安全的,而用linkedlist实现可以是非线程安全,也可以是线程安全,具体可以靠自己的实现机制。
    而stack基调已经定了,Vector也是线程安全的,所以选用了Vector。
    而且根据源码发现:
    stack用Vector只需要增加栈元素的入栈和弹出以及搜索就可以了:

    public E push(E item) {
    addElement(item);
    
        return item;
    }
    
    /**
     * Removes the object at the top of this stack and returns that
     * object as the value of this function.
     *
     * @return  The object at the top of this stack (the last item
     *          of the <tt>Vector</tt> object).
     * @throws  EmptyStackException  if this stack is empty.
     */
    public synchronized E pop() {
        E       obj;
        int     len = size();
    
        obj = peek();
        removeElementAt(len - 1);
    
        return obj;
    }
    
    /**
     * Looks at the object at the top of this stack without removing it
     * from the stack.
     *
     * @return  the object at the top of this stack (the last item
     *          of the <tt>Vector</tt> object).
     * @throws  EmptyStackException  if this stack is empty.
     */
    public synchronized E peek() {
        int     len = size();
    
        if (len == 0)
            throw new EmptyStackException();
        return elementAt(len - 1);
    }
    
    /**
     * Tests if this stack is empty.
     *
     * @return  <code>true</code> if and only if this stack contains
     *          no items; <code>false</code> otherwise.
     */
    public boolean empty() {
        return size() == 0;
    }
    
    /**
     * Returns the 1-based position where an object is on this stack.
     * If the object <tt>o</tt> occurs as an item in this stack, this
     * method returns the distance from the top of the stack of the
     * occurrence nearest the top of the stack; the topmost item on the
     * stack is considered to be at distance <tt>1</tt>. The <tt>equals</tt>
     * method is used to compare <tt>o</tt> to the
     * items in this stack.
     *
     * @param   o   the desired object.
     * @return  the 1-based position from the top of the stack where
     *          the object is located; the return value <code>-1</code>
     *          indicates that the object is not on the stack.
     */
    public synchronized int search(Object o) {
        int i = lastIndexOf(o);
    
        if (i >= 0) {
            return size() - i;
        }
        return -1;
    }

    而linkedlist是具有链表形式的数据结构,不能像Vector那样直接扩展。

    2019-07-17 19:36:15
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载