Java Stack类中的empty()与isEmpty()有什么区别?

39

为什么Java中的Stack除了通常的isEmpty()方法还有一个empty()方法?因为所有Stack继承的抽象类都有一个isEmpty()方法。


7
文档上写了什么? - Gabe
empty() 的返回类型是什么? - bumbumpaw
1
两者都具有布尔返回类型。 - Aafreen Sheikh
3
isEmpty() 方法基本上是在 Collections 类(JDK 1.2)中引入的,而该类是在 Stack 类(JDK 1.0)之后推出的。 - vandale
2个回答

78
我认为OP的问题更多是关于:为什么会有重复的方法,因为empty()和isEmpty()做同样的事情吗?
如果你仔细看一下,在Vector、Stack和HashTable中,有更多做相似事情但名字不同的方法。
这里简要介绍一下历史:
在JDK 1.0时期,Java中没有“Collection”框架。Stack、Vector、HashTable是Java提供的一些基本数据结构。
后来在JDK 1.2中,Collection框架被添加到JDK中,并引入了标准接口(如List、Map)。
然而,在这些新的标准集合接口中,方法的命名采用了不同的约定。这种命名约定的变化很可能受到了也在JDK 1.2中引入的Java Bean标准的影响。这些方法名与旧的Stack、Vector和HashTable类中的方法名不同。例如,在原始类中它被命名为empty(),但在Collection接口中被命名为isEmpty()。
为了使Stack、Vector和HashTable与Collection框架兼容,Stack、Vector和HashTable实现了其对应的Collection接口。同时,为了向后兼容而保留了旧的方法。
因此,你现在看到的就是“重复”的方法。

遗憾的是,@depricated 注解后来也被引入了,但在 Stack 中仍然缺失。 - Martin Frank
1
@MartinFrank 我认为Stack没有被弃用的原因并不是因为@Deprecated不可用。实际上,Java中的弃用概念比你想象的要早得多。它最初是在Javadoc中完成的。没有明显的理由去弃用Stack。 - Adrian Shum
栈(Stack)非常值得使用!但是empty()isEmpty()的二义性需要被澄清 - 抱歉,我之前表达不够清晰... - Martin Frank
@MartinFrank 好的,集合框架中的Deque是Stack更好的替代品。从我的理解来看,Stack/Vector等之所以没有被弃用,是因为它们被认为是遗留的API,这是为了保持旧代码的运行而保留的。虽然它们已经过时了,但它们还没有被(现在)视为被弃用,这意味着禁止使用它们(并且可能会在将来删除)。如果它们被视为遗留代码,那么旧方法(empty())就不应该被标记为弃用,否则它将失去保留这些遗留类的目的。 - Adrian Shum
这是一个非常合理的答案 - 感谢您与我分享您的知识!每当我在算法中看到堆栈一词时,这使我使用Stack,但是很正确:Deque应该是我的选择工具!!再次感谢! - Martin Frank

0

两者都返回布尔值,唯一的区别是isEmpty是同步的,指向向量,而empty不是同步的,指向堆栈


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接