Java集合-Stack

简介: Java集合-Stack

44b9fc24b88515eeec3ab134da493142.jpg

Java集合-Stack

Stack(java.util.Stack)类是典型的栈数据结构,可以从头部插入,读取和移除元素。Stack是List接口的一个实现,但是很少使用Stack作为List- 除非需要检查当前存储在Stack中的所有元素。

注意,Stack类是Vector的子类,Vector是java中一个古老的同步类, 这种同步会增加对Stack中所有方法的调用的开销。另外,Vector还使用了几个古老的java部分(不再推荐),支持Iterator的Enumeration ,如果为了避免这种问题可以使用Deque。


Stack基础

Stack这数据结构,是可以在顶部加入元素,并且可以从顶部删除元素也就是我们说的"后进先出 (LIFO)"原子,相反的Queue采用的是"先进先出(FIFO)"原则,从尾部添加元素,从头部删除元素。


创建Stack

创建 Stack实例:

Stack stack = new Stack();


使用泛型创建Stack

创建Stack时可以指定泛型类型:

Stack<String> stack = new Stack<String>();
Stack实例中只能包含String实例对象。


Stack添加元素

创建了Stack实例,就可以往顶部添加元素,添加的元素必须是Stack对象,使用push()方法添加元素:

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

上面例子将String类型的“1”添加到Stack的顶部。


Stack取出并移除元素

如果往Stack中添加了元素,则也可以从中取出并移除元素,可以使用pop()方法:

Stack<String> stack = new Stack<String>();
stack.push("1");
String topElement = stack.pop();

一旦调用了pop()方法,则Stack中就不存在此元素了。


从Stack顶部获取元素

可以调用Stack的peek() 方法查看Stack的第一个元素,而且并不移除元素:

Stack<String> stack = new Stack<String>();
stack.push("1");
String topElement = stack.peek();

执行代码后topElement变量的值是“1”,而且还存在中。


搜索Stack中元素的位置

可以通过Stack的search()方法查找元素的位置,搜索时使用的是 equals()方法进行元素比较,如果元素在顶部则索引位置值为1:

Stack<String> stack = new Stack<String>();
stack.push("1");
stack.push("2");
stack.push("3");
int index = stack.search("3");     //index = 3


Stack的大小

可以通过Stack的size()方法获取Stack中元素的个数:

Stack<String> stack = new Stack<String>();
stack.push("1");
stack.push("2");
stack.push("3");
int size = stack.size();

执行代码后 size的值是3。


迭代 Stack中的元素

可以通过 Stack的iterator()方法获取Iterator,对Stack进行迭代:

Stack<String> stack = new Stack<String>();
stack.push("123");
stack.push("456");
stack.push("789");
Iterator iterator = stack.iterator();
while(iterator.hasNext()){
    Object value = iterator.next();
}


使用Stream的进程Stack

也可以通过Stream Api处理上的元素。首先通过Stream()方法从堆栈获取流。一旦从Stack上获取了Stream,你们就可以迭代:

Stack<String> stack = new Stack<String>();
stack.push("A");
stack.push("B");
stack.push("C");
Stream stream = stack.stream();
stream.forEach((element) -> {
    System.out.println(element);  // print element
});


使用Stack反转List

可以使用Stack反正List,首先把List中的元素全部添加到中,然后将List清空,然后迭代Stack,将Stack中的元素取出并移除添加到List中:

List<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");
System.out.println(list);
Stack<String> stack = new Stack<String>();
while(list.size() > 0) {
    stack.push(list.remove(0));
}
while(stack.size() > 0){
    list.add(stack.pop());
}
System.out.println(list);


使用Deque作为Stack

可以将Deque作为Stack使用,从头部添加和取出元素:

Deque<String> dequeAsStack = new ArrayDeque>String>();
dequeAsStack.push("one");
dequeAsStack.push("two");
dequeAsStack.push("three");
String one   = dequeAsStack.pop();
String two   = dequeAsStack.pop();
String three = dequeAsStack.pop();
目录
相关文章
|
3月前
|
存储 算法 安全
Java集合框架:理解类型多样性与限制
总之,在 Java 题材中正确地应对多样化与约束条件要求开发人员深入理解面向对象原则、范式编程思想以及JVM工作机理等核心知识点。通过精心设计与周密规划能够有效地利用 Java 高级特征打造出既健壮又灵活易维护系统软件产品。
128 7
|
4月前
|
Java 大数据 API
Java Stream API:现代集合处理与函数式编程
Java Stream API:现代集合处理与函数式编程
299 100
|
4月前
|
Java API 数据处理
Java Stream API:现代集合处理新方式
Java Stream API:现代集合处理新方式
327 101
|
4月前
|
存储 Java Go
对比Java学习Go——函数、集合和OOP
Go语言的函数支持声明与调用,具备多返回值、命名返回值等特性,结合`func`关键字与类型后置语法,使函数定义简洁直观。函数可作为一等公民传递、赋值或作为参数,支持匿名函数与闭包。Go通过组合与接口实现面向对象编程,结构体定义数据,方法定义行为,接口实现多态,体现了Go语言的简洁与高效设计。
|
4月前
|
算法 Java
50道java集合面试题
50道 java 集合面试题
|
5月前
|
存储 NoSQL Java
Java Stream API:集合操作与并行处理
Stream API 是 Java 8 提供的集合处理工具,通过声明式编程简化数据操作。它支持链式调用、延迟执行和并行处理,能够高效实现过滤、转换、聚合等操作,提升代码可读性和性能。
|
5月前
|
存储 缓存 安全
Java集合框架(三):Map体系与ConcurrentHashMap
本文深入解析Java中Map接口体系及其实现类,包括HashMap、ConcurrentHashMap等的工作原理与线程安全机制。内容涵盖哈希冲突解决、扩容策略、并发优化,以及不同Map实现的适用场景,助你掌握高并发编程核心技巧。
|
5月前
|
存储 缓存 安全
Java集合框架(二):Set接口与哈希表原理
本文深入解析Java中Set集合的工作原理及其实现机制,涵盖HashSet、LinkedHashSet和TreeSet三大实现类。从Set接口的特性出发,对比List理解去重机制,并详解哈希表原理、hashCode与equals方法的作用。进一步剖析HashSet的底层HashMap实现、LinkedHashSet的双向链表维护顺序特性,以及TreeSet基于红黑树的排序功能。文章还包含性能对比、自定义对象去重、集合运算实战和线程安全方案,帮助读者全面掌握Set的应用与选择策略。
339 23
|
5月前
|
存储 安全 Java
Java集合框架(一):List接口及其实现类剖析
本文深入解析Java中List集合的实现原理,涵盖ArrayList的动态数组机制、LinkedList的链表结构、Vector与Stack的线程安全性及其不推荐使用的原因,对比了不同实现的性能与适用场景,帮助开发者根据实际需求选择合适的List实现。
|
5月前
|
安全 Java 开发者
Java集合框架:详解Deque接口的栈操作方法全集
理解和掌握这些方法对于实现像浏览器后退功能这样的栈操作来说至关重要,它们能够帮助开发者编写既高效又稳定的应用程序。此外,在多线程环境中想保证线程安全,可以考虑使用ConcurrentLinkedDeque,它是Deque的线程安全版本,尽管它并未直接实现栈操作的方法,但是Deque的接口方法可以相对应地使用。
320 12