`
man_yutao
  • 浏览: 39659 次
  • 性别: Icon_minigender_1
  • 来自: 梦的国度
社区版块
存档分类
最新评论

ArrayList和Vector的扩容机制

 
阅读更多
ArrayList和Vector都是继承了相同的父类和实现了相同的接口。如下
public class Vector<E>
    extends AbstractList<E>
    implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{}

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{}

两者之间我认为主要有两个却别。
1、Vector中的public方法都添加了synchronized关键字,以确保方法同步。
2、内部属性不同,这也是导致扩容方式不同的原因所在。

我现在来说第二条,
ArrayList有两个属性,存储数据的数组elementData,和存储记录数目的size。
Vector有三个属性,存储数据的数组elementData,存储记录数目的elementCount,还有扩展数组大小的扩展因子capacityIncrement。

先来看ArrayList的扩展方法
 public void ensureCapacity(int minCapacity) {
	modCount++;//父类中的属性,记录集合变化次数
	int oldCapacity = elementData.length;
	if (minCapacity > oldCapacity) {
	    Object oldData[] = elementData;
	    int newCapacity = (oldCapacity * 3)/2 + 1;
    	    if (newCapacity < minCapacity)
		newCapacity = minCapacity;
	    elementData = (E[])new Object[newCapacity];
	    System.arraycopy(oldData, 0, elementData, 0, size);
	}
    }

重构下看起来更方便
 public void ensureCapacity(int minCapacity) {
	modCount++;//父类中的属性,记录集合变化次数
	int oldCapacity = elementData.length;
	if (minCapacity > oldCapacity) {//扩容的条件,数组需要的长度要大于实际长度
	    Object oldData[] = elementData;
	    int newCapacity = ((oldCapacity * 3)/2 + 1)<minCapacity?minCapacity: ((oldCapacity * 3)/2 + 1);
    	   elementData = (E[])new Object[newCapacity];
	    System.arraycopy(oldData, 0, elementData, 0, size);
	}
    }

可以看到,再满足扩容条件时,扩展后数组大小为((原数组长度*3)/2+1)与传递参数中较大者

再看看Vector的扩容方法
public synchronized void ensureCapacity(int minCapacity) {
	modCount++;//父类中的属性,记录集合变化次数
	ensureCapacityHelper(minCapacity);
    }
 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 = new Object[newCapacity];
	    System.arraycopy(oldData, 0, elementData, 0, elementCount);
	}
    }


可以看到,相对于ArrayList的扩容方法,这个方法被一分为2,老实说我更喜欢这样,方法的职责更加明确。


int newCapacity = (capacityIncrement > 0) ?(oldCapacity + capacityIncrement) : (oldCapacity * 2);

当扩容因子大于0时,新数组长度为原数组长度+扩容因子,否子新数组长度为原数组长度的2倍。


   if (newCapacity < minCapacity) {newCapacity = minCapacity;}

将上面生成的新数组长度与传递的参数要求长度作比较,较大者为最终的新长度。
1
0
分享到:
评论

相关推荐

    ArrayList、Vector、LinkedList 的区别.docx

    在扩容机制方面,ArrayList 和 Vector 都维护了一个 Object[] 对象数组用于存储对象,但是 ArrayList 的对象数组通过 transient 修饰,不可序列化。Vector 维护了一个 capacityIncrement 字段,可以通过构造器去设置...

    ArrayList LinkedList Vector性能对比

    Vector的扩容策略与ArrayList相同,只是其默认初始容量和增长因子不同于ArrayList。 在选择这三个类时,应考虑以下几个因素: 1. **性能**:如果需要频繁的随机访问,ArrayList通常是更好的选择;如果插入和删除...

    Java中ArrayList和Vector的区别共2页.p

    - ArrayList在插入和删除元素时通常比Vector更高效,因为Vector的同步机制会在这些操作中引入额外的开销。 - 当容量需要扩展时,ArrayList和Vector都会创建一个新的更大容量的数组,然后将旧数组的数据复制到新...

    JDK1.6中Arraylist,Vector,LinkedList源码

    1. 容量管理:观察ArrayList和Vector如何进行扩容,了解它们扩容的策略和成本。 2. 插入和删除:比较ArrayList、Vector和LinkedList在插入和删除元素时的代码实现,分析时间复杂度。 3. 线程安全:分析Vector如何...

    ArrayList Vector LinkedList 区别与用法.

    这意味着它们的底层是一个数组,当数据量超过当前数组容量时,会自动扩容,通常扩容为原容量的1.5倍或2倍。 - 这种存储方式使得这两种集合能够快速地通过索引访问元素,但插入或删除元素时,尤其是当元素位于数组...

    Vector 与ArrayList区别

    这种策略可以更好地平衡内存使用和扩容频率,减少内存浪费的同时保证性能。 **3. 使用模式** - **索引操作**:无论是 `Vector` 还是 `ArrayList`,在指定位置查找元素或在集合末尾添加/删除元素所需的时间复杂度...

    数组的扩容和链表结构.zip

    总之,理解并掌握Java数组的扩容机制和链表结构,是提升Java编程技能的关键一步。通过合理选择和优化这些数据结构,我们可以编写出更加高效和灵活的代码。在实践中,根据具体需求选择合适的数据结构,是提高程序性能...

    vector定义及与ArrayList的比较

    3. **双参数构造方法** `Vector(int size, int incr)`:创建一个空的`Vector`,同时指定了初始容量`size`和每次扩容时的增量`incr`。 4. **Collection参数构造方法** `Vector(Collection c)`:根据已有的`Collection...

    ArrayList的实现原理

    4. **扩容机制** - 当添加元素导致数组满时,ArrayList会创建一个容量更大的新数组,通常是原容量的1.5倍(或者根据JVM和JDK版本有所不同)。然后将旧数组的元素复制到新数组中。这种扩容策略平衡了空间效率和时间...

    Java中的ArrayList的底层源码解读、LinkedList、Vector的区别介绍

    适用人群:JavaSE初学者,对源码感兴趣的,想要深度了解ArrayList底层实现、数据结构、add方法、Remove方法、以及自动扩容机制的同学,并且对ArrayList已经有过使用,想要学习它与LinkedList,Vector等的区别,该...

    集合框架面试题.pdf

    Vector默认扩容为原来的两倍,而ArrayList的扩容策略在Java文档中没有明确指出,但源码显示扩容大约是原来的1.5倍。此外,Vector允许设定增长因子,而ArrayList则不提供这样的设置选项。 2. LinkedList是另一种List...

    你知道synchronizedList和Vector底层原理实现和区别吗?其实开始我也不知道!(超详细源码分析)

    因为Vector和ArrayList除了数组扩容有点差别,还有加锁使Vector迈进了线程安全的行列外,底层实现大约是没有太大区别的!基本一致!线程安全问题更是另当别论了!继续往下看就OK! 扩容的区别: 从内部实现机制来讲...

    ArrayList源码.zip

    当添加元素时,如果当前容量不足,ArrayList会自动扩容,通常扩容为原来的1.5倍。这种设计使得ArrayList在插入元素时有较好的性能表现,但删除元素特别是中间位置的元素时,效率相对较低,因为需要移动后续元素。 ...

    java 中的vector-详解Java中的Vector

    - `Vector(int initialCapacity, int capacityIncrement)`:除了指定初始容量外,还可以指定每次扩容时增加的容量。 - `Vector(Collection&lt;? extends E&gt; c)`:根据给定的`Collection`实例创建`Vector`,并将`...

    JAVA提高第十篇 ArrayList深入分析

    扩容的过程发生在`ensureCapacityInternal(int minCapacity)`和`grow(int minCapacity)`方法中,它们会创建新的数组并将旧数组的元素复制到新数组。 三、ArrayList的内部工作机制 1. 扩容策略:当添加元素导致容量...

    jdk源码阅读一:ArrayList

    - `public void ensureCapacity(int minCapacity)`:此方法首先计算最小扩展容量`minExpand`,然后根据`minCapacity`和`minExpand`的比较结果决定是否需要扩容。扩容操作由`ensureExplicitCapacity`方法完成。 - *...

    Java Vector 的相关知识

    - `Vector`提供了一个`ensureCapacity`方法来预分配足够的空间,以减少未来的扩容操作,而`ArrayList`没有这样的方法。 #### 三、数据增长机制 `Vector`的数据增长机制主要体现在两个方面: 1. **初始容量**:...

    ArrayList的自动扩充机制实例解析

    此外,与ArrayList类似的还有HashMap和Vector。HashMap的初始大小为16,增长时,直接容量翻番,如源代码所示。Vector的初始大小为10,如果没有指定每次增长的大小,则默认是翻倍增长。 ArrayList的自动扩充机制实例...

    java 集合操作

    例如,ArrayList和Vector在容量不足时会自动扩容,而LinkedList没有固定容量限制。此外,LinkedList保持了插入顺序,而ArrayList和Vector默认不保证元素顺序。 总的来说,理解并熟练掌握ArrayList、Vector和...

    详解Java中的Vector

    "详解Java中的Vector" Java中的Vector是实现自动增长的对象数组,通过实例代码详细介绍了Vector的使用和...通过了解Vector的构造函数、扩容机制和线程安全机制,我们可以更好地使用Vector来实现高效的数据存储和操作。

Global site tag (gtag.js) - Google Analytics