Ja va里的Stack类,说简单点就是一个后进先出(LIFO, Last In First Out)的栈数据结构。它直接继承了Vector类,所以自带同步机制。今天咱们就把它掰开揉碎了看看。

一、基本操作

1. 入栈(push)

push()方法把元素扔到栈顶,就像叠盘子,新来的永远在最上面。

Stack stack = new Stack<>();
stack.push(1);
stack.push(2);

2. 出栈(pop)

pop()方法负责把栈顶元素拿走并且返回它。注意,如果栈里空空如也,它会直接抛个EmptyStackException出来,所以用之前最好先判断一下。

int popped = stack.pop(); // 返回2

3. 查看栈顶元素(peek)

peek()pop()的区别在于:它只看不拿——返回栈顶元素,但不移除。同样,空栈会抛异常。

int top = stack.peek(); // 返回1

4. 检查栈是否为空(empty)

empty()判断一下,返回布尔值,很直观。

boolean isEmpty = stack.empty();

二、其他方法

1. 搜索元素(search)

search()方法会告诉你某个元素离栈顶有多远。比如栈顶是第1个位置,依次往下。如果元素压根不存在,直接返回-1。

int position = stack.search(2); // 返回1

三、注意事项

使用Stack类时,有几个地方得留个心眼。

1. 线程安全

因为继承自VectorStack所有方法都是同步的,多线程环境下可以直接用,省事。但话说回来,如果不需要同步,追求性能的话,还是建议用Deque接口的实现类,比如ArrayDeque,它通常跑得更快。

2. 泛型使用

Stack支持泛型,可以明确指定存什么类型,比如Stack,这样编译时就能拦住类型错误。

3. 与其他集合的转换

可以用toArray()把栈转成数组,也能用迭代器挨个遍历栈里的元素,灵活度还是有的。

总的来说,Stack类干活利索,处理后进先出的场景非常顺手。不过在实际项目里,得想清楚是否需要它的线程安全特性,再掂量掂量有没有更合适的替代方案。选对了工具,代码写起来才舒服。

本文转载于:http://www.quxiu.com//news/2483901.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。