【Java集合系列三】Vector-Stack解析

2017-07-29 12:59:14

一、简介

1、Vector继承关系

2、Vector类扩容

Vector类的实现和ArrayList极其相似,都使用数组存储元素,但是扩容策略不一样,ArrayList基本是按照1.5倍的思路扩容,Vector是按照创建Vector对象时设置的capacityIncrement值递增的,如果该值没有设置或者为0,则直接Double,如下:

3、Vector的线程安全性

Vector号称是线程安全的,它的安全性来自于几乎给每个方法都添加了synchronized关键字,由于锁对象是当前对象,只要有一个线程在执行某一个加锁的方法,也就是获得到当前对象这个锁对象,其他线程基本都不能再使用这个Vector对象了...这是一种很残暴的设计,估计这可能是synchronized刚出来之时,JDK团队的一时兴奋之作吧~

举几个例子:

即便是有一些方法没有直接加synchronized关键字,至少它所调用的方法都是加了的。

4、Stack

Stack继承自Vector,提供了pop、push、peek、search等栈的特殊操作,源码如下:

  1 package java.util;
  2
  3 /**
  4  * The <code>Stack</code> class represents a last-in-first-out
  5  * (LIFO) stack of objects. It extends class <tt>Vector</tt> with five
  6  * operations that allow a vector to be treated as a stack. The usual
  7  * <tt>push</tt> and <tt>pop</tt> operations are provided, as well as a
  8  * method to <tt>peek</tt> at the top item on the stack, a method to test
  9  * for whether the stack is <tt>empty</tt>, and a method to <tt>search</tt>
 10  * the stack for an item and discover how far it is from the top.
 11  * <p>
 12  * When a stack is first created, it contains no items.
 13  *
 14  * <p>A more complete and consistent set of LIFO stack operations is
 15  * provided by the {@link Deque} interface and its implementations, which
 16  * should be used in preference to this class.  For example:
 17  * <pre>   {@code
 18  *   Deque<Integer> stack = new ArrayDeque<Integer>();}</pre>
 19  *
 20  * @author  Jonathan Payne
 21  * @since   JDK1.0
 22  */
 23 public
 24 class Stack<E> extends Vector<E> {
 25     /**
 26      * Creates an empty Stack.
 27      */
 28     public Stack() {
 29     }
 30
 31     /**
 32      * Pushes an item onto the top of this stack. This has exactly
 33      * the same effect as:
 34      * <blockquote><pre>
 35      * addElement(item)</pre></blockquote>
 36      *
 37      * @param   item   the item to be pushed onto this stack.
 38      * @return  the <code>item</code> argument.
 39      * @see     java.util.Vector#addElement
 40      */
 41     public E push(E item) {
 42         addElement(item);
 43
 44         return item;
 45     }
 46
 47     /**
 48      * Removes the object at the top of this stack and returns that
 49      * object as the value of this function.
 50      *
 51      * @return  The object at the top of this stack (the last item
 52      *          of the <tt>Vector</tt> object).
 53      * @throws  EmptyStackException  if this stack is empty.
 54      */
 55     public synchronized E pop() {
 56         E       obj;
 57         int     len = size();
 58
 59         obj = peek();
 60         removeElementAt(len - 1);
 61
 62         return obj;
 63     }
 64
 65     /**
 66      * Looks at the object at the top of this stack without removing it
 67      * from the stack.
 68      *
 69      * @return  the object at the top of this stack (the last item
 70      *          of the <tt>Vector</tt> object).
 71      * @throws  EmptyStackException  if this stack is empty.
 72      */
 73     public synchronized E peek() {
 74         int     len = size();
 75
 76         if (len == 0)
 77             throw new EmptyStackException();
 78         return elementAt(len - 1);
 79     }
 80
 81     /**
 82      * Tests if this stack is empty.
 83      *
 84      * @return  <code>true</code> if and only if this stack contains
 85      *          no items; <code>false</code> otherwise.
 86      */
 87     public boolean empty() {
 88         return size() == 0;
 89     }
 90
 91     /**
 92      * Returns the 1-based position where an object is on this stack.
 93      * If the object <tt>o</tt> occurs as an item in this stack, this
 94      * method returns the distance from the top of the stack of the
 95      * occurrence nearest the top of the stack; the topmost item on the
 96      * stack is considered to be at distance <tt>1</tt>. The <tt>equals</tt>
 97      * method is used to compare <tt>o</tt> to the
 98      * items in this stack.
 99      *
100      * @param   o   the desired object.
101      * @return  the 1-based position from the top of the stack where
102      *          the object is located; the return value <code>-1</code>
103      *          indicates that the object is not on the stack.
104      */
105     public synchronized int search(Object o) {
106         int i = lastIndexOf(o);
107
108         if (i >= 0) {
109             return size() - i;
110         }
111         return -1;
112     }
113
114     /** use serialVersionUID from JDK 1.0.2 for interoperability */
115     private static final long serialVersionUID = 1224463164541339165L;
116 }

5、结尾

Vector和ArrayList的异同:

1、扩容策略不同;

2、线程安全的;

3、提供了一些独特的如removeElement()之类的方法;

4、其他方法的实现与ArrayList几乎是一致的,毕竟都是对数组的操作;

5、忽略这个类即可;

时间: 2024-10-11 08:25:42

【Java集合系列三】Vector-Stack解析的相关文章

【转】 Java 集合系列07之 Stack详细介绍(源码解析)和使用示例

概要 学完Vector了之后,接下来我们开始学习Stack.Stack很简单,它继承于Vector.学习方式还是和之前一样,先对Stack有个整体认识,然后再学习它的源码:最后再通过实例来学会使用它.内容包括:第1部分 Stack介绍第2部分 Stack源码解析(基于JDK1.6.0_45)第3部分 Vector示例 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3308852.html 第1部分 Stack介绍 Stack简介 Stack是栈.它的

(转)Java 集合系列07之 Stack详细介绍(源码解析)和使用示例

概要 学完Vector了之后,接下来我们开始学习Stack.Stack很简单,它继承于Vector.学习方式还是和之前一样,先对Stack有个整体认识,然后再学习它的源码:最后再通过实例来学会使用它.内容包括:第1部分 Stack介绍第2部分 Stack源码解析(基于JDK1.6.0_45)第3部分 Vector示例 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3308852.html 第1部分 Stack介绍 Stack简介 Stack是栈.它的

Java 集合系列07之 Stack详细介绍(源码解析)和使用示例

http://www.cnblogs.com/skywang12345/p/3308852.html 概要 学完Vector了之后,接下来我们开始学习Stack.Stack很简单,它继承于Vector.学习方式还是和之前一样,先对Stack有个整体认识,然后再学习它的源码:最后再通过实例来学会使用它.内容包括:第1部分 Stack介绍第2部分 Stack源码解析(基于JDK1.6.0_45)第3部分 Vector示例 转载请注明出处:http://www.cnblogs.com/skywang1

Java集合系列(三):HashSet、LinkedHashSet、TreeSet的使用方法及区别

本篇博客主要讲解Set接口的三个实现类HashSet.LinkedHashSet.TreeSet的使用方法以及三者之间的区别. 注意:本文中代码使用的JDK版本为1.8.0_191 1. HashSet使用 HashSet是Set接口最常用的实现类,底层数据结构是哈希表,HashSet不保证元素的顺序但保证元素必须唯一. private transient HashMap<E,Object> map; HashSet类的代码声明如下所示: public class HashSet<E&g

【Java集合系列六】LinkedHashMap解析

2017-08-14 16:30:10 1.简介 LinkedHashMap继承自HashMap,能保证迭代顺序,支持其他Map可选的操作.采用双向链表存储元素,默认的迭代序是插入序.重复插入一个已经存在的key不影响此顺序.如果accessOrder参数被使用且置为true,迭代序使用访问序,访问序受put.get.putAll等方法的影响,但不受集合视图操作的影响(其实HashMap中好像并没有什么视图操作,不像List有subList方法).LinkedHashMap不是线程安全的. 2.

【Java集合系列五】HashMap解析

2017-07-31 19:36:00 一.简介 1.HashMap作用及使用场景 HashMap利用数组+单向链表的方式,实现了key-value型数据的存储功能.HashMap的size永远是2^x的值,主要是为了更加均衡的使用数组位置. 2.存储key-value型数据的数据结构 如下代码,HashMap中定义了Node类,实现了Map.Entry接口,Entry接口只有set和get方法定义,极其简单.Node中定义了key.value.hash及指向下一个Node的指针next,Nod

深入理解JAVA集合系列三:HashMap的死循环解读

由于在公司项目中偶尔会遇到HashMap死循环造成CPU100%,重启后问题消失,隔一段时间又会反复出现.今天在这里来仔细剖析下多线程情况下HashMap所带来的问题: 1.多线程put操作后,get操作导致死循环. 2.多线程put非null元素后,get操作得到null值. 3.多线程put操作,导致元素丢失. 死循环场景重现 下面我用一段简单的DEMO模拟HashMap死循环: 1 public class Test extends Thread 2 { 3 static HashMap<

【Java集合系列】目录

2017-07-29 13:49:40 一.Collection的全局继承关系 二.系列文章 [Java集合系列一]ArrayList解析 [Java集合系列二]LinkedList解析 [Java集合系列三]Vector-Stack解析

Java 集合系列 06 Stack详细介绍(源码解析)和使用示例

java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java 集合系列 04 LinkedList详细介绍(源码解析)和使用示例 Java 集合系列 05 Vector详细介绍(源码解析)和使用示例 Java 集合系列 06 Stack详细介绍(源码解析)和使用示例 第1部分 Stack介绍 Stack简介 Stack是栈.它的特性是:先进后出(FILO, F