一天一个类,一点也不累。

今天要说的是ArrayList的亲兄弟--Vector

亲兄弟?看看“族谱”

Class Vector<E>

    java.lang.Object
java.util.AbstractCollection<E>
java.util.AbstractList<E>
java.util.Vector<E> All Implemented Interfaces:
Serializable, Cloneable, Iterable<E>, Collection<E>, List<E>, RandomAccess Direct Known Subclasses:
Stack public class Vector<E>
extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, Serializable

发现 他们俩就是亲兄弟啊~~

The Vector class implements a growable array of objects. Like an array, it contains components that can be accessed using an integer index. However, the size of a Vector can grow or shrink as needed to accommodate adding and removing items after the Vector has been create。

Vecotor 实现了可变的数组,和数组一样,提供了使用下标来访问对象。Vector创建之后,可以按照需求来增加或者收缩。

Each vector tries to optimize storage management by maintaining a capacity and a capacityIncrement.

使用capacity 和 capacityIncrecement实现存储空间的管理。capacity 容量,capacityIncrement 增长步

1、他的构造方法有三种,

  Vector()   默认的大小为10

Vector(Collection<? extends E> c)同样使用数组工具类Arrays的copyOf()

Vector(int initialCapacity, int capacityIncrement) 同时指定了容器的容量和增长步长。

2、实现了从Vector到数组的转换

  copyInto(Object[] anArray);

3、一个很有情怀的方法

  在构造函数中,我们有些时候,初始化容量的时候,会有很多剩余空间没被使用,这样的话,就浪费了(浪费可耻!!~)

  给我们提供了一个方法,trimToSize()将容量的值,设置为当前容器的size.

其中的实现:

    public synchronized void trimToSize() {
modCount++;
int oldCapacity = elementData.length;
if (elementCount < oldCapacity) {
elementData = Arrays.copyOf(elementData, elementCount);
}

可见他也是使用Arrays.copyOf(),需要将数据拷贝一次。所以也是很消耗时间的。

4、在这里我们也许要着重说一下Vector的增长方式

  首先呢,在构造的时候我们可以指定,capacityIncrement;如果没有指定也可以后期使用函数来指定,

    public synchronized void ensureCapacity(int minCapacity) //指定最小的增长;

其实这个Vector可以自动增长的,

private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
                                         capacityIncrement : oldCapacity);  //【如果没有指定capacityIncrement,那么newCapacity = oldCapacity+oldCapacity;就是二倍增长!!!】
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

这里就是讲这么多了,其实这个类还有好多的方法,这些方法和上次讲的ArrayList()种的方法是一样的使用,可以自行查看。

【重要】虽说好些方法和ArrayList()使用方法是一样的,但是大家可能发现了,这个类种几乎所有的方法都是synchronized同步的!!

  这就是说相比ArrayList()这个是线程安全的。

【谢谢大家,欢迎指正。】

【转载请注明出处http://home.cnblogs.com/u/plxx/】

一天一个类,一点也不累 之 Vector的更多相关文章

  1. 一天一个类,一点也不累 之 Set接口

    我们的口号是:一天一个类,一点也不累-- 再次回忆一下集合相关的类图. 官方API上这样介绍这个接口: A collection that contains no duplicate elements ...

  2. 一天一个类,一点也不累 之 LinkedList

    我们的口号是,一天一个类,一点也不累 .. 今天要讲的是---LinkedList 首先,还是看看他的组织结构 Class LinkedList<E> java.lang.Object j ...

  3. 一天一个类,一点也不累之TreeSet

    一天一个类,一点也不累. 现在要说的是---TreeSet public class TreeSet<E> extends AbstractSet<E> implements ...

  4. 一天一个类,一点也不累之HashSet

    最近忙着一个小项目结题,故没能按时完成[一天一个类,一点也不累],还好项目优秀,算是对自己一点点的安慰和鼓励.~~~ 今天要说的是HashSet 既然是继承自Set,那么就必须有Set的一些属性,比如 ...

  5. java进阶之反射:反射基础之如何获取一个类以及如何获取这个类的所有属性和方法(2)

    当我们知道一个类的对象,或者知道一个类的路径,或者指导这个类的名称的时候我们可以获取到这个类的类对象 当我们仅仅知道一个类的类对象的时候我们依然无法操作这个类,因为我们不知道这个类的属性,类的方法.那 ...

  6. Java中是否可以调用一个类中的main方法?

    前几天面试的时候,被问到在Java中是否可以调用一个类中的main方法?回来测试了下,答案是可以!代码如下: main1中调用main2的主方法 package org.fiu.test; impor ...

  7. [转]自己写PHP扩展之创建一个类

    原文:http://www.imsiren.com/archives/572 比如我们要创建一个类..PHP代码如下 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...

  8. 重写toString()方法来描述一个类

    package com.zch.test; /* toString方法以及重写toString方法 toString方法是一个自我描述方法 方法本身返回的是该对象的实现类的 类名 + @ + hash ...

  9. Java中的一个类怎么调用另一个类中的方法

    如果另一个类中的那个方法是私有的话,就不能直接调用到,如果是其他类型的话看情况,如果是静态的(static)话,直接用类名可以调用到,如果是非静态的,就需要利用另一个类的实例(也就是用那个类生成的对象 ...

随机推荐

  1. MVC设计模式JavaWeb实现

    JSP开发模式 jsp开发模式的发展 1.模式1:(适合小型项目的技术的开发)     a.第一版本号.纯jsp(封装数据.处理数据,显示数据)     b.第二版本号,Jsp+JavaBean.   ...

  2. Linux常用命令总结——文件管理

    Linux中的目录 路径:也就是linux中的目录(文件夹)有绝对路径和相对路径 根目录:/ 用户主目录(home directory):位于/home目录下,用户登录时 工作目录(working d ...

  3. javascripts小结

    1 NAN-isNaN():判断是否数值 2 数值转换 Number()-任何数据类型,parseInt(),parseFloat()-字符串 3数组转字符串 var a=["red&quo ...

  4. linux命令: patch

    一. 针对单文件的patch: 我们以mkprj.sh.1和mkprj.sh两个文件为例: [root@localhost tst]# lsmkprj.sh.1  mkprj.sh 看两个文件的差异: ...

  5. Median of Two Sorted Arrays-分治法

    题目意思很简单将两个有序数组合并之后的中位数找出来.题目要求使用log(m+n)的时间复杂度来做. 虽然言简意赅,但不得不承认这个题目我自己想了好久也没做出来,隐约觉得应该使用寻找第k大数的算法来做, ...

  6. YII2 Gridview

    YII2 Gridview 部分使用规则 1.页面显示的时间戳转换 a. [ 'label'=>'创建日期', 'attribute' => 'created_at', 'filter' ...

  7. php随笔6-thinkphp OA系统 JS 实时显示当前时间

    不多说,直入主题: JS. // JavaScript Document function showtime() { var today,hour,second,minute,year,month,d ...

  8. PHP学习笔记11-表单

    处理GET请求 实现的功能是输入姓名后页面显示“Hello XXX” 创建html文件hello.html: <!DOCTYPE html> <html> <head l ...

  9. (转)跟我一起写MAKEFILE

    概述 —— 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makef ...

  10. How do I Find Out Linux CPU Utilization?

    From:http://www.cyberciti.biz/tips/how-do-i-find-out-linux-cpu-utilization.html Whenever a Linux sys ...