gpt4 book ai didi

Java集合Stack源码详解

转载 作者:qq735679552 更新时间:2022-09-28 22:32:09 26 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章Java集合Stack源码详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

概要 。

学完Vector了之后,接下来我们开始学习Stack。Stack很简单,它继承于Vector。学习方式还是和之前一样,先对Stack有个整体认识,然后再学习它的源码;最后再通过实例来学会使用它.

  。

第1部分 Stack介绍

  。

  。

Stack简介 。

Stack是栈。它的特性是:先进后出(FILO, First In Last Out).

java工具包中的Stack是继承于Vector(矢量队列)的,由于Vector是通过数组实现的,这就意味着,Stack也是通过数组实现的,而非链表。当然,我们也可以将LinkedList当作栈来使用!在“Java 集合系列06之 Vector详细介绍(源码解析)和使用示例”中,已经详细介绍过Vector的数据结构,这里就不再对Stack的数据结构进行说明了.

  。

Stack的继承关系 。

java.lang.Object ↳     java.util.AbstractCollection<E>    ↳     java.util.AbstractList<E>        ↳     java.util.Vector<E>            ↳     java.util.Stack<E> 。

public class Stack<E> extends Vector<E> {} 。

Stack和Collection的关系如下图:

Java集合Stack源码详解

  。

Stack的构造函数 。

Stack只有一个默认构造函数,如下:

Stack() Stack的API 。

Stack是栈,它常用的API如下:

            boolean       empty() synchronized E             peek() synchronized E             pop()              E             push(E object) synchronized int           search(Object o) 。

由于Stack和继承于Vector,因此它也包含Vector中的全部API.

  。

第2部分 Stack源码解析(基于JDK1.6.0_45)

  。

Stack的源码非常简单,下面我们对它进行学习.

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package java.util;
 
public
class Stack<E> extends Vector<E> {
  // 版本ID。这个用于版本升级控制,这里不须理会!
  private static final long serialVersionUID = 1224463164541339165L;
 
  // 构造函数
  public Stack() {
  }
 
  // push函数:将元素存入栈顶
  public E push(E item) {
   // 将元素存入栈顶。
   // addElement()的实现在Vector.java中
   addElement(item);
 
   return item;
  }
 
  // pop函数:返回栈顶元素,并将其从栈中删除
  public synchronized E pop() {
   E obj;
   int len = size();
 
   obj = peek();
   // 删除栈顶元素,removeElementAt()的实现在Vector.java中
   removeElementAt(len - 1 );
 
   return obj;
  }
 
  // peek函数:返回栈顶元素,不执行删除操作
  public synchronized E peek() {
   int len = size();
 
   if (len == 0 )
    throw new EmptyStackException();
   // 返回栈顶元素,elementAt()具体实现在Vector.java中
   return elementAt(len - 1 );
  }
 
  // 栈是否为空
  public boolean empty() {
   return size() == 0 ;
  }
 
  // 查找“元素o”在栈中的位置:由栈底向栈顶方向数
  public synchronized int search(Object o) {
   // 获取元素索引,elementAt()具体实现在Vector.java中
   int i = lastIndexOf(o);
 
   if (i >= 0 ) {
    return size() - i;
   }
   return - 1 ;
  }
}

  。

总结:

(01) Stack实际上也是通过数组去实现的。 执行push时(即,将元素推入栈中),是通过将元素追加的数组的末尾中。 执行peek时(即,取出栈顶元素,不执行删除),是返回数组末尾的元素。 执行pop时(即,取出栈顶元素,并将该元素从栈中删除),是取出数组末尾的元素,然后将该元素从数组中删除。 (02) Stack继承于Vector,意味着Vector拥有的属性和功能,Stack都拥有.

  。

第3部分 Vector示例

  。

下面我们通过实例学习如何使用Stack 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import java.util.Stack;
import java.util.Iterator;
import java.util.List;
 
/**
  * @desc Stack的测试程序。测试常用API的用法
  *
  * @author skywang
  */
public class StackTest {
 
  public static void main(String[] args) {
   Stack stack = new Stack();
   // 将1,2,3,4,5添加到栈中
   for ( int i= 1 ; i< 6 ; i++) {
    stack.push(String.valueOf(i));
   }
 
   // 遍历并打印出该栈
   iteratorThroughRandomAccess(stack) ;
 
   // 查找“2”在栈中的位置,并输出
   int pos = stack.search( "2" );
   System.out.println( "the postion of 2 is:" +pos);
 
   // pup栈顶元素之后,遍历栈
   stack.pop();
   iteratorThroughRandomAccess(stack) ;
 
   // peek栈顶元素之后,遍历栈
   String val = (String)stack.peek();
   System.out.println( "peek:" +val);
   iteratorThroughRandomAccess(stack) ;
 
   // 通过Iterator去遍历Stack
   iteratorThroughIterator(stack) ;
  }
 
  /**
   * 通过快速访问遍历Stack
   */
  public static void iteratorThroughRandomAccess(List list) {
   String val = null ;
   for ( int i= 0 ; i<list.size(); i++) {
    val = (String)list.get(i);
    System.out.print(val+ " " );
   }
   System.out.println();
  }
 
  /**
   * 通过迭代器遍历Stack
   */
  public static void iteratorThroughIterator(List list) {
 
   String val = null ;
   for (Iterator iter = list.iterator(); iter.hasNext(); ) {
    val = (String)iter.next();
    System.out.print(val+ " " );
   }
   System.out.println();
  }
 
}

运行结果:

1 2 3 4 5 the postion of 2 is:4 1 2 3 4 peek:4 1 2 3 4 1 2 3 4 。

原文链接:http://blog.51cto.com/sihai/2117265 。

最后此篇关于Java集合Stack源码详解的文章就讲到这里了,如果你想了解更多关于Java集合Stack源码详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com