Stack源码解析(JDK1.7)

本文主要解析JDK1.7中Stack的数据结构,Stack是Vector的一个子类,具备线程安全特性。在构造方法和扩容机制上,Stack沿用了Vector的设计,但扩容时不是ArrayList的1.5倍,而是直接扩容至原来的2倍。由于Stack主要依赖Vector的方法,因此其源码相对简洁。
摘要由CSDN通过智能技术生成
Stack源码解析(JDK1.7)

摸鱼摸鱼~!


Stack的层次关系图

在这里插入图片描述

从层次图中看到… 所有的接口都在以前的博文中介绍过了… 这里还没有解析过的是 Vector (线程安全的列表类)


Vector

我粗略的读了一下…

实现的方式几乎和 ArrayList 一模一样… 就是每个方法进行加锁…

这里就简单的把一些不一样的地方,有些重要的地方拿出来看一下…

构造方法 上
//构造方法中... 
//默认也是使用10作为默认容量... 不过 有点不一样的是
//ArrayList 中使用的 是 1.5倍的扩容.. 这里确实可以指定一个扩容的数量进行扩容..
//稍微细致一点... 这边是先进行实例化存储单元的... 底层也是使用一个数组进行存储的..
public Vector(int initialCapacity, int capacityIncrement) {
    super();
    if (initialCapacity < 0)
        throw new IllegalArgumentException("Illegal Capacity: "+
                                           initialCapacity);
    this.elementData = new Object[initialCapacity];
    this.capacityIncrement = capacityIncrement;
}

扩容机制

从实例方法中发现… 了扩容机制可能不太一样… 直接瞄上扩容机制… 发现确实有蹊跷

结论: 在没有指定 一个增长容量的参数时候 会扩容到原来的2倍 不是arrayList的1.5倍!

private void grow(int minCapacity) {
    // overflow-conscious code
    int oldCapacity = elementData.length;
    // 不指定的时候 capcityIncrement 为 0 
    // so 2倍!
    int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
                                     capacityIncrement : oldCapacity);
    if (newCapacity - minCapacity < 0)
        newCapacity = minCapacity;
    if (newCapacity - MAX_ARRAY_SIZE > 0)
        newCapacity = hugeCapacity(minCapacity);
    elementData = Arrays.copyOf(elementData, newCapacity);
}

简单介绍了一下 Vector之后…Statck的源码 就很简单了- -…几乎都是使用的Vector的方法…

Stack

// 这里就是代码的全部了…就这么点东西- - …

注意 ! Stack 是线程安全的!

public
class Stack<E> extends Vector<E> {
    public Stack() {} 
    public E push(E item) {
        addElement(item);
        return item;
    }
    public synchronized E pop() {
        E       obj;
        int     len = size();
        obj = peek();
        removeElementAt(len - 1);

        return obj;
    }
    public synchronized E peek() {
        int     len = size();
        if (len == 0)
            throw new EmptyStackException();
        return elementAt(len - 1);
    }
    public boolean empty() {
        return size() == 0;
    }
    public synchronized int search(Object o) {	//这个方法还别致的...没用过
        int i = lastIndexOf(o);
        if (i >= 0) {
            return size() - i;
        }
        return -1;
    }
    private static final long serialVersionUID = 1224463164541339165L;
}

结束
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值