`

Java集合工具类之List - Vector & Stack

阅读更多

 

3. List

3.1 Vector

1 Vector 的数据结构和工作原理

Vector 是基本数据结构一个可变数组,数组的元素可以是任意对象,当 Vector 初始创建时,会创建一个一定容量(Capacity)的(默认为 10 )数组对象,当添加的对象超过数组的容量时, Vector 在内部会重新创建一个新的数组,再把原数组元素拷贝到新的数组里面,这样就完成了动态数组的功能。 Vector 的构造器有三种

1) public Vector(int initialCapacity, int capacityIncrement)

initialCapacity 是数组的初始化长度, capacityIncrement 是当数组长度超过原长度时,数组长度增长的步长, capacityIncrement 0 时,此种情况当数组长度超过原长度峰值时,此时数组长度变为原来的 2 倍。当数组长度变化,原有的数据和新的数组对象是通过 copy 来完成的。

2) public Vector(int initialCapacity)

3) public Vector()

Vector 默认构造器的数组的长度是 10

 

 

核心方法:

/**

     * 核心方法之一:保证数组的容量,如果没有指定容量的增长的步长,则将原数组容量扩 * 大成原来的两倍,如果指定则按照增长的步长增加容量,并且取 minCapacity *newCapacity 计算出来的最大值进行取值。计算出来的最终容量将作为新数组对象的尺 * 寸,并将原来数组的元素 copy 到新数组里面来。

     *

     * @see #ensureCapacity(int)

     */

    private void ensureCapacityHelper( int minCapacity) {

    int oldCapacity = elementData . length ;

    if (minCapacity > oldCapacity) {

        Object[] oldData = elementData ;

        int newCapacity = ( capacityIncrement > 0) ?

       (oldCapacity + capacityIncrement ) : (oldCapacity * 2);

         if (newCapacity < minCapacity) {

       newCapacity = minCapacity;

        }

            elementData = Arrays.copyOf ( elementData , newCapacity);

    }

    }

 

2.Vector 使用时需要注意的问题

1) Vector 使用时,最好能够预期需要存放元素的个数,这样可以避免数组长度频繁的改变而引起数据的 copy 带来的开销,同时会引起内存大小的增加。

2 )使用 Vector 需要知道 Vector 是线程安全的。因此,在使用时,最好是考虑这个对象会不会因为多个线程访问该 Vector 对象,如果确认只有单个线程访问,则可以用 ArrayList 来代替 Vector

 

 

3.    Stack

Vector 可以轻松改造成 Stack ,栈的特点是先进后出,对于一个栈来说,主要方法包括, push(E e), pop, peek,empty search(E e).

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

   

    public Stack(){

       super (10);

    }

   

    public void push(E e){

       this .add(e);

    }

   

    public E pop(){

       return this .remove( this .size()-1);

    }

   

    public boolean empty(){

       return this .size()==0;

    }

   

    public int search(E e){
        for (int i = 0; i < this.size(); i++) {
            if(this.elementAt(i).equals(e)){
                return i;
            }else{
                continue;
            }
        }
       
        return -1;
    }

}

分享到:
评论

相关推荐

    Java期末复习-类集框架

    List接口、ArrayList类、Vector类、栈操作类Stack、链表操作类LinkList、队列操作接口Queue、Set接口、HashSet类、TreeSet类、SortedSet接口 双值操作接口Map(key-&gt;value)及其子接口、子类: SortedMap接口、HashMap...

    跟汤老师学Java(第13季):集合

    4.List:ArrayList、LinkedList、Vector、Stack 5.Set:HashSet、TreeSet 6.Map:HashMap、Hashtable、Properties 7.Collections工具类 教学全程采用笔记+代码案例的形式讲解,通俗易懂!!!

    了解Collection 和 Collections

    Collection 和 Collections区别 java.util.Collection 是一个集合接口(集合类的一个顶级接口)。 它提供了对集合对象进行基本...java.util.Collections 是一个包装类(工具类/帮助类)。 它包含有各种有关集合操作的

    Java开发技术大全 电子版

    第13章常用工具类391 13.1Runtime类的使用391 13.1.1内存管理392 13.1.2执行其他程序393 13.2System类的使用395 13.2.1利用currentTimeMillis()记录程序执行的时间395 13.2.2利用exit()退出虚拟机396 13.2.3...

    C++思维导图Xmind文件和.png文件(持续更新)

    C++思维导图Xmind文件和.png文件: 构造函数与析构函数思维导图Xmind文件和.png文件 拷贝构造思维导图xmind文件...STL适配器——stack && queue STL——list C++——继承 C++——搜索二叉树 C++——AVL树 C++——红黑树

    C和C++头文件对比一览

    经常在CSDN以及其他之类的技术论坛上问关于C++ 头文件的问题。提出这些问题的往往就是那些刚学C++的新手。当初我是菜鸟的时候也问过类似的问题。 现在来看看下面两个include: #include&lt;iostream&gt; // 这个...

    STL 源码剖析(侯捷先生译著)

    源码之前了无秘密,你将看到vector的实现、list的实现、heap的实现、deque的实现、RB-tree的实现、hash-table的实现、set/map 的实现;你将看到各种算法(排序、搜寻、排列组合、数据移动与复制…)的实现;你甚至将...

    Java高并发高性能分布式框架从无到有微服务架构设计(1).doc

    使用JAVA中效率高的类,比如Array List比Vector性能好.&gt;高并发 - 需要解决的问题一:应用缓存二:缓存三:多级缓存四:池化五:异步并发六:扩容七 :队列高并发-应用缓存堆缓存 使用Java堆内存来存储缓存对象....

    STL源码剖析.pdg

    4.5.4 以list 做为stack 的底层容器 168 4.6 queue 169 4.6.1 queue 概述 169 4.6.2 queue 定义式完整列表 170 4.6.3 queue 没有迭代器 171 4.6.4 以list 做为queue 的底层容器 171 4.7 heap(隐式表述,...

    C++标准程序库STL的架构

    10.1.3 使用自定义的Stack类 124 10.2 Queue 125 10.2.1 核心接口 126 10.2.2 Queue运用实例 126 10.2.3 使用者自定义的队列 126 10.3 Priority Queue 128 10.3.1 核心接口 128 10.3.2 运用实例 128 10.4 Bitset 129...

    传智播客扫地僧视频讲义源码

    13_干活要知道在什么框架之下干活 14_结构体类型和变量定义及基本操作 15_结构体元素做函数参数pk结构指针做函数参数 16_结构体做函数基本操作 17_结构体做函数内存分配指针 18_结构中套一级指针 19_结构体中套二级...

Global site tag (gtag.js) - Google Analytics