Stack源码解析

Java中的Stack类是通过继承Vector来实现栈功能的,因此它的底层数据结构是数组,保证了线程安全。尽管不推荐直接使用Stack,但其提供了push、pop、peek等基本栈操作。在需要高效栈操作时,通常建议使用ArrayDeque替代。Stack的构造方法和主要方法如push、pop、peek和empty都是线程安全的,其中pop和peek方法使用了synchronized关键字。
摘要由CSDN通过智能技术生成
概述

stack是栈,特点是先进后出(FILO, First In Last Out).Java工具包的Stack是通过继承Vector来实现的,因为Vector的底层数据结构是使用数组实现的,这也意味着Stack的栈结构是通过数组实现的而不是链表.也因为这样Stack是线程安全的.因为Java已经不推荐使用Stack,所以当需要使用栈时,而是推荐使用更高效的ArrayDeque;因为Queue只是一个接口,当需要使用队列时首选ArrayDeque(其次是LinkedList)

#### 构造方法

```java
    public Stack() {
    }
push()

将该元素添加到栈的顶部


    /**
     * Pushes an item onto the top of this stack. This has exactly
     * the same effect as:
     * <blockquote><pre>
     * addElement(item)</pre></blockquote>
     *
     * @param   item   the item to be pushed onto this stack.
     * @return  the <code>item</code> argument.
     * @see     java.util.Vector#addElement
     */
    public E push(E item) {
        addElement(item);

        return item;
    }
pop()

此方法使用synchronized 同步锁修饰,说明是线程安全的;移除堆栈顶部的对象,并作为此函数的值返回该对象。


    /**
     * Removes the object at the top of this stack and returns that
     * object as the value of this function.
     *
     * @return  The object at the top of this stack (the last item
     *          of the <tt>Vector</tt> object).
     * @throws  EmptyStackException  if this stack is empty.
     */
    public synchronized E pop() {
        E       obj;
        int     len = size();

        obj = peek();
        removeElementAt(len - 1);

        return obj;
    }
peek()

查看此堆栈顶部的对象而不删除它


    /**
     * Looks at the object at the top of this stack without removing it
     * from the stack.
     *
     * @return  the object at the top of this stack (the last item
     *          of the <tt>Vector</tt> object).
     * @throws  EmptyStackException  if this stack is empty.
     */
    public synchronized E peek() {
        int     len = size();

        if (len == 0)
            throw new EmptyStackException();
        return elementAt(len - 1);
    }
empty()

判断此栈是否为空


    /**
     * Tests if this stack is empty.
     *
     * @return  <code>true</code> if and only if this stack contains
     *          no items; <code>false</code> otherwise.
     */
    public boolean empty() {
        return size() == 0;
    }
search()

返回指定元素的索引位置


    /**
     * Returns the 1-based position where an object is on this stack.
     * If the object <tt>o</tt> occurs as an item in this stack, this
     * method returns the distance from the top of the stack of the
     * occurrence nearest the top of the stack; the topmost item on the
     * stack is considered to be at distance <tt>1</tt>. The <tt>equals</tt>
     * method is used to compare <tt>o</tt> to the
     * items in this stack.
     *
     * @param   o   the desired object.
     * @return  the 1-based position from the top of the stack where
     *          the object is located; the return value <code>-1</code>
     *          indicates that the object is not on the stack.
     */
    public synchronized int search(Object o) {
        int i = lastIndexOf(o);

        if (i >= 0) {
            return size() - i;
        }
        return -1;
    }
serialVersionUID

    /** use serialVersionUID from JDK 1.0.2 for interoperability */
    private static final long serialVersionUID = 1224463164541339165L;
Just Do It:

“你的无畏源于无知”
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`startActivityLocked` 是 Android Framework 中的一个核心方法,用于启动新的 Activity。这个方法定义在 `ActivityStackSupervisor` 类中。 下面是 `startActivityLocked` 方法的源码: ```java final ActivityRecord startActivityLocked(ActivityRecord r, ActivityRecord focusedTopActivity, boolean newTask, boolean keepCurTransition, ActivityOptions options) { if (r == null) { if (DEBUG_STACK) Slog.v(TAG_STACK, "startActivityLocked: r=null"); return null; } // 获取任务栈 final TaskRecord task = r.getTask(); if (task != null && task.getStack() == null) { // 确保任务所在栈存在 if (!createStackOnDisplay(task, task.getLaunchDisplayId())) { return null; } } // ... } ``` 首先,方法会检查传入的 `ActivityRecord` 是否为 `null`,如果为 `null`,则直接返回 `null`。 然后,方法会获取 `ActivityRecord` 所属的任务栈,如果任务所属的栈不存在,则会尝试在指定的显示器上创建一个新的栈。 接下来的代码中,会检查传入的 `ActivityRecord` 是否可以启动。如果可以启动,则会将新的 `ActivityRecord` 添加到任务栈中,并根据传入的参数决定是否保留当前的过渡动画。 最后,方法会返回新的 `ActivityRecord` 对象,用于后续的操作。 需要注意的是,`startActivityLocked` 方法是在 `ActivityStackSupervisor` 类中定义的,该类是 Android Framework 中与任务栈相关的核心类之一。在方法中,会涉及到任务栈的创建、任务栈中任务的启动、任务栈的管理等操作。因此,对这个方法的深入理解需要掌握 Android Framework 中任务栈的相关知识。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值