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

今天要说的是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. Android 带password输入界面的Dialog实现机制

    1.布局实现: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:andr ...

  2. VS2008编译iconv静态链接库

    iconv是将一种编码格式转换为还有一种编码格式的开源库,比如能够把Windows环境下通用的ASCii(中文是GB2312)编码转换为国际通用的Unicode编码 iconv最新版本号仅仅支持Min ...

  3. STL之priority_queue为复合结构排序

    priority_queue为复合结构排序: #include <iostream> #include <queue> using namespace std; struct ...

  4. 解決 centos中-bash: vim: command not found

    用centos 的主机的時候, 用 vim 时出现 -bash: vim: command not found. 只能使用 vi. 那么如何安裝 vim 呢? 输入 rpm -qa|grep vim ...

  5. 什么是DNS劫持和DNS污染?

    什么是DNS劫持和DNS污染? http://blogread.cn/it/article/7758?f=weekly 说明 我们知道,某些网络运营商为了某些目的,对 DNS 进行了某些操作,导致使用 ...

  6. 如何使用SublimeText风格的代码高亮样式 添加Zed Coding(EMMET)插件

    因为觉得博客园自带的代码高亮样式很单一,不符合作为前端的我的审美习惯,于是下定决心要想办法折腾出一个方法来应用上另外一套代码高亮样式. 虽然探索的过程是很痛苦的,但最后还是成功了,但也不枉付出的那些努 ...

  7. JS 获取星期几的四种写法

    今天是星期几的4种JS代码写法,有需要的朋友可以参考一下 第一种写法 复制代码代码如下: var str = "";  var week = new Date().getDay() ...

  8. Python之路:迭代器和yield生成器

    一.迭代器 对于Python 列表的 for 循环,他的内部原理:查看下一个元素是否存在,如果存在,则取出,如果不存在,则报异常 StopIteration.(python内部对异常已处理) 使用迭代 ...

  9. hdu1695 GCD

    http://acm.hdu.edu.cn/showproblem.php?pid=16951 /** 大意: a<=x<=b , c<= y <= d ,求在此范围内 有多少 ...

  10. phpeclipse

    http://phpeclipse.sourceforge.net/update/stable/1.2.x/