java为什么不推荐使用stack_为什么 java.util.Stack不被官方所推荐使用!

Java 为什么不推荐使用 Stack 呢?

因为 Stack 是 JDK 1.0 的产物。它继承自 Vector,Vector 都不被推荐使用了,你说 Stack 还会被推荐吗?

当初 JDK1.0 在开发时,可能为了快速的推出一些基本的数据结构操作,所以推出了一些比较粗糙的类。比如,Vector、Stack、Hashtable等。这些类中的一些方法加上了 synchronized 关键字,容易给一些初级程序员在使用上造成一些误解!而且在之前的几个版本中,性能还不怎么好。

基于 Vector 实现的栈 Stack。底层实际上还是数组,所以还是存在需要扩容。Vector 是由数组实现的集合类,它包含了大量集合处理的方法。而 Stack 之所以继承 Vector,是为了复用 Vector 中的方法,来实现进栈(push)、出栈(pop)等操作。这里就是 Stack 设计不好的地方,既然只是为了实现栈,不用链表来单独实现,而是为了复用简单的方法而迫使它继承 Vector,Stack 和 Vector 本来是毫无关系的。这使得 Stack 在基于数组实现上效率受影响,另外因为继承 Vector 类,Stack 可以复用 Vector 大量方法,这使得 Stack 在设计上不严谨。

Java 提供了 Deuqe。Deque 是继承自 Queue,而 Stack 是继承自 Vector。Java 中的 Deuqe,即“double ended queue”的缩写,是 Java 中的双端队列集合类型。Deque 具备普通队列 FIFO 的功能,同时它也具备了 Stack 的 LIFO 功能,并且保留了 push 和 pop 函数,所以使用起来应该是一点障碍都没有。

ArrayDeque 是 Deque 接口的一种具体实现,是依赖于可变数组来实现的。ArrayDeque 没有容量限制,可根据需求自动进行扩容。ArrayDeque 可以作为栈来使用,效率要高于 Stack。ArrayDeque 也可以作为队列来使用,效率相较于基于双向链表的 LinkedList 也要更好一些。注意,ArrayDeque 不支持为 null 的元素。

关于java.util.stack的底层实现

当push一个元素时:

public E push(E item) {

addElement(item);

return item;

}

实际上调用但是Vector的addElement方法

public synchronized void addElement(E obj) {

modCount++;

ensureCapacityHelper(elementCount + 1);

elementData[elementCount++] = obj;

}

而Vector的底层实现就是一个数组,初始大小为10,每当元素超出就增长为原来的2倍,和ArrayList的增长方式类似。

public class Vector

extends AbstractList

implements List, RandomAccess, Cloneable, java.io.Serializable{

protected Object[] elementData;

public Vector() {

//初始大小为10

this(10);

}

public Vector(int initialCapacity) {

this(initialCapacity, 0);

}

public Vector(int initialCapacity, int capacityIncrement) {

super();

if (initialCapacity < 0)

throw new IllegalArgumentException("Illegal Capacity: "+

initialCapacity);

//初始化为10

this.elementData = new Object[initialCapacity];

this.capacityIncrement = capacityIncrement;

……

}

总结:在java.util.stack中,栈的底层是使用数组来实现的,数组初始大小为10。每当元素个数超出数组容量就扩展为原来的2倍,将原数组中的元素拷贝到新数组中,随着数组元素的增多,这种开销也越大。

​ Java并不推荐使用java.util.stack来进行栈的操作,而是推荐使用一个双端队列“deque ”来代替它。

关于“deque”

public interface Dequeextends Queue

它是一个线性 collection,支持在两端插入和移除元素。名称 deque 是“double ended queue(双端队列)”的缩写,通常读为“deck”。大多数 Deque 实现对于它们能够包含的元素数没有固定限制,但此接口既支持有容量限制的双端队列,也支持没有固定大小限制的双端队列。

此接口定义在双端队列两端访问元素的方法。提供插入、移除和检查元素的方法。每种方法都存在两种形式:一种形式在操作失败时抛出异常,另一种形式返回一个特殊值(null 或 false,具体取决于操作)。插入操作的后一种形式是专为使用有容量限制的 Deque 实现设计的;在大多数实现中,插入操作不能失败。

双端队列也可用作 LIFO(后进先出)堆栈。应优先使用此接口而不是遗留 Stack 类。在将双端队列用作堆栈时,元素被推入双端队列的开头并从双端队列开头弹出。堆栈方法完全等效于 Deque 方法

java&period;util&period;Stack类中 empty&lpar;&rpar; 和 isEmpty&lpar;&rpar; 方法的作用

最近在学习算法和数据结构,用到Java里的Stack类,但程序运行结果一直和我预料的不一样,网上也没查清楚,最后查了API,才搞明白. java.util.Stack继承类 java.util.Vec ...

java&period;util&period;Stack类中的peek&lpar;&rpar;方法

java.util.stack类中常用的几个方法:isEmpty(),add(),remove(),contains()等各种方法都不难,但需要注意的是peek()这个方法. peek()查看栈顶的对 ...

java&period;util&period;Stack&lpar;栈&rpar;的简单使用

import java.util.Stack; import org.junit.Before; import org.junit.Test; /** * Stack(栈)继承了Vector类,底层实 ...

用 LinkedList 实现一个 java&period;util&period;Stack 栈

用 LinkedList 实现一个 java.util.Stack 栈 import java.util.LinkedList; public class Stack { priva ...

java&period;util&period;Stack

import java.util.Stack; public class Test { public static void main(String[] args) { Stack stack = n ...

java&period;util&period;Stack类简介

Stack是一个后进先出(last in first out,LIFO)的堆栈,在Vector类的基础上扩展5个方法而来 Deque(双端队列)比起Stack具有更好的完整性和一致性,应该被优先使用 ...

java&period;util&period;Stack类简介(栈)

Stack是一个后进先出(last in first out,LIFO)的堆栈,在Vector类的基础上扩展5个方法而来 Deque(双端队列)比起stack具有更好的完整性和一致性,应该被优先使用 ...

Java中的栈:java&period;util&period;Stack类

public class Stackextends VectorStack 类表示后进先出(LIFO)的对象堆栈.它通过五个操作对类 Vector 进行了扩展 ,允 ...

手写代码注意点--java&period;util&period;Stack相关

1-Stack的基本函数为: 注意: 取栈顶的函数为peek(),不是top()... 测试stack是否为空的函数为empty(),不是isEmpty()...

随机推荐

【腾讯Bugly干货分享】微信mars 的高性能日志模块 xlog

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值