Java容器类源码-Vector的最全的源码分析(二)

三、源码解读

1. 继承、实现

extends:AbstractList

implements:List, RandomAccess, Cloneable, java.io.Serializable

2. 全局变量

(1) 存放数据的数组

protected Object[] elementData;

(2) 存放数量

protected int elementCount;

(3) 容量增量

protected int capacityIncrement;

3. 构造方法

(1) 不带参数的构造方法

public Vector() {

this(10);

}

(2) 带初始化容量大小的构造方法

/**

* @param initialCapacity 初始化容量大小

*/

public Vector(int initialCapacity) {

this(initialCapacity, 0);

}

(3) 带初始化容量和容量增量的构造方法

/**

* @param initialCapacity初始化容量大小

* @param capacityIncrement 容量增量

*/

public Vector(int initialCapacity, int capacityIncrement) {

super();

if (initialCapacity < 0)

throw new IllegalArgumentException("Illegal Capacity: "+

initialCapacity);

this.elementData = new Object[initialCapacity];

this.capacityIncrement = capacityIncrement;

}

(4) 带Colleciton参数的构造方法

/**

* @param c 将c转为Vector

*/

public Vector(Collection c) {

elementData = c.toArray();

elementCount = elementData.length;

// c.toArray might (incorrectly) not return Object[] (see 6260652)

if (elementData.getClass() != Object[].class)

elementData = Arrays.copyOf(elementData, elementCount, Object[].class);

}

4. 方法

(1) public synchronized void copyInto(Object[] anArray)

源码解释:

通过JNI调用c++库的arraycopy方法,实现将anArray数组复制到当前的Vector。

public synchronized void copyInto(Object[] anArray) {

System.arraycopy(elementData, 0, anArray, 0, elementCount);

}

(2) public synchronized void trimToSize()

源码解释:

用以优化Vector的内存,我们都知道,Vector的每次容量增量是当前大小的2倍,但是当我们没法用完申请的这么多内存时,我们可以通过调用这个方法用以将不需要的内存释放掉。

public synchronized void trimToSize() {

modCount++;// 修改次数增加

int oldCapacity = elementData.length;// 获取到当前的申请的内存大小

if (elementCount < oldCapacity) {// 如果当前存放的数量比申请的内存要少

elementData = Arrays.copyOf(elementData, elementCount);// 重新为这个数组申请elementCount大小内存,并存放这些数据

}

}

(3) public synchronized void ensureCapacity(int minCapacity)

源码解释:

当要扩容时,会调用此方法,保证当前容量能存放得下所需要存放的元素数量。如果不够时,会调用grow()方法进行扩容。

public synchronized void ensureCapacity(int minCapacity) {

if (minCapacity > 0) {

modCount++;

ensureCapacityHelper(minCapacity);

}

}

private void ensureCapacityHelper(int minCapacity) {

// overflow-conscious code

if (minCapacity - elementData.length > 0)

grow(minCapacity);// 如果当前容量比数组的长度要小时,调用grow扩容

}

private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

/**

* Vector的扩容方法, 每次扩容至2倍

* @param minCapacity

*/

private void grow(int minCapacity) {

// overflow-conscious code

int oldCapacity = elementData.length;// 获取到数组的长度

int newCapacity = oldCapacity + ((capacityIncrement > 0) ? capacityIncrement : oldCapacity); //如果没有初始化capacityIncrement,则增加至两倍

if (newCapacity - minCapacity < 0)

newCapacity = minCapacity;

if (newCapacity - MAX_ARRAY_SIZE > 0)// 如果扩容后的容量超过了最大容量

newCapacity = hugeCapacity(minCapacity);// 调用hugeCapacity方法

elementData = Arrays.copyOf(elementData, newCapacity);// 将数组复制到扩容后的新内存中去

}

private static int hugeCapacity(int minCapacity) {

if (minCapacity < 0) // overflow

throw new OutOfMemoryError();

return (minCapacity > MAX_ARRAY_SIZE) ?

Integer.MAX_VALUE :

MAX_ARRAY_SIZE;

}

(4) public synchronized void setSize(int newSize)

源码解释:

修改容量,当newSize比数组的长度要大时,将其复制到新的内存区域,如果要小的话,则从newSize位置到数组的最后一个位置的所有元素置为空。

public synchronized void setSize(int newSize) {

modCount++;

if (newSize > elementCount) {

ensureCapacityHelper(newSize);

} else {

for (int i = newSize ; i < elementCount ; i++) {

elementData[i] = null;

}

}

elementCount = newSize;

}

(5) public synchronized int capacity()

源码解释:

返回数组长度,即申请内存的长度。

public synchronized int capacity() {

return elementData.length;

}

(6) public synchronized int size()

源码解释:

返回数组已经使用的长度,即存放的数据个数。

public synchronized int size() {

return elementCount;

}

(7) public synchronized boolean isEmpty()

源码解释:

判空,如果数量为0,即为empty。

public synchronized boolean isEmpty() {

return elementCount == 0;

}

(8) public Enumeration<E> elements()

源码解释:

返回一个Enumeration对象的序列。Enumeration只有两个方法,hasMoreElements()和nextElement(),它只能从首个元素遍历到最后一个元素,并不能根据位置拿到具体的元素。

public Enumeration elements() {

return new Enumeration() {

int count = 0;

public boolean hasMoreElements() {

return count < elementCount;

}

public E nextElement() {

synchronized (Vector.this) {

if (count < elementCount) {

return elementData(count++);

}

}

throw new NoSuchElementException("Vector Enumeration");

}

};

}

(9) public boolean contains(Object o)

源码解释:

是否包含对象o。调用indexOf判断是否存在。

public boolean contains(Object o) {

return indexOf(o, 0) >= 0;

}

public int indexOf(Object o) {

return indexOf(o, 0);

}

(10) public synchronized int indexOf(Object o, int index)

源码解释:

判断o是否为空,如果为空,则遍历是否存在值为空的元素;不为空,判断是否存在和o相等的元素。

public synchronized int indexOf(Object o, int index) {

if (o == null) {

for (int i = index ; i < elementCount ; i++)

if (elementData[i]==null)

return i;

} else {

for (int i = index ; i < elementCount ; i++)

if (o.equals(elementData[i]))

return i;

}

return -1;

}

(11) public synchronized int lastIndexOf

源码解释:

获取该元素所处的最后一个位置,不存在则返回-1

public synchronized int lastIndexOf(Object o) {

return lastIndexOf(o, elementCount-1);

}

public synchronized int lastIndexOf(Object o, int index) {

if (index >= elementCount)

throw new IndexOutOfBoundsException(index + " >= "+ elementCount);

if (o == null) {

for (int i = index; i >= 0; i--)

if (elementData[i]==null)

return i;

} else {

for (int i = index; i >= 0; i--)

if (o.equals(elementData[i]))

return i;

}

return -1;

}

(12) public synchronized E elementAt(int index)

源码解释:

返回这个位置的元素。其实就是判断数组的index位置是否有元素

public synchronized E elementAt(int index) {

if (index >= elementCount) {

throw new ArrayIndexOutOfBoundsException(index + " >= " + elementCount);

}

return elementData(index);

}

E elementData(int index) {

return (E) elementData[index];

}

(13) public synchronized E firstElement()

源码解释:

返回数组第0个位置的元素。

public synchronized E firstElement() {

if (elementCount == 0) {

throw new NoSuchElementException();

}

return elementData(0);

}

(14) public synchronized E lastElement()

源码解释:

返回数组最后一个位置的元素。

public synchronized E lastElement() {

if (elementCount == 0) {

throw new NoSuchElementException();

}

return elementData(elementCount - 1);

}

(15) public synchronized void setElementAt(E obj, int index)

源码解释:

修改第index位置的值为obj。其实就是数组赋值。

public synchronized void setElementAt(E obj, int index) {

if (index >= elementCount) {

throw new ArrayIndexOutOfBoundsException(index + " >= " +

elementCount);

}

elementData[index] = obj;

}

每天都在分享文章,也每天都有人想要我出来给大家分享下怎么去学习Java。大家都知道,我们是学Java全栈的,大家就肯定以为我有全套的Java系统教程。没错,我是有Java全套系统教程,进扣裙【47】974【9726】所示,进群的时候记得表明自己想要学习什么,不要用小号,这样小编才好给你们发定向资源,今天小编就免费送!~

“我们相信人人都可以成为一个程序员,现在开始,找个师兄,带你入门,学习的路上不再迷茫。这里是ja+va修真院,初学者转行到互联网行业的聚集地。"

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容

  • 童话故事《萝卜房子》讲了这么一个故事: 一位老爷爷在床底下发现了一颗萝卜苗,老爷爷说:“就让它长着吧,说不定能长出...
    我是长弓阅读 20,189评论 12 50
  • 你说,会不会每一颗树都曾是一只死掉的鹿,它的角自此便站成了永恒的孤独。 传说,很久很久以前,是没有森林的。 在一个...
    夜语寒阅读 755评论 0 0
  • 其实我还是蛮喜欢做服务行业的。 今天晚上继续在学校里的便利店做做兼职。学校的小商店自然是零食和饮料为主。有句老话说...
    愚人cc阅读 308评论 1 2
  • 早上又是“嗡嗡嗡,嗡嗡嗡”的声音把我吵醒了。妈妈说:“咱娘俩还是快出去‘避避难’吧!这样我可受不了!”“好...
    n宁n阅读 366评论 0 1