ArrayList和Vector的扩容机制
来源:互联网 发布:淘宝鞋店推荐 编辑:程序博客网 时间:2024/05/29 19:04
ArrayList中ensureCapacity扩容,trimToSize容量调整到适中,Vector的扩容,是可以指定扩容因子,同时Vector扩容策略是:原来容量的2倍与原来容量+扩容因子,两者中取容量大的,进行扩容
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;}
将上面生成的新数组长度与传递的参数要求长度作比较,较大者为最终的新长度。
转载地址:http://man-yutao.iteye.com/blog/1317446
0 0
- ArrayList和Vector的扩容机制
- ArrayList和Vector的扩容机制
- ArrayList和Vector的扩容机制
- ArrayList和Vector的扩容机制
- ArrayList和Vector区别以及其扩容机制
- ArrayList的扩容机制
- ArrayList的扩容机制
- ArrayList的扩容机制
- Java和Android中ArrayList与Vector的扩容比较
- Java ArrayList的自动扩容机制
- 关于ArrayList扩容机制
- ArrayList扩容机制
- ArrayList 原理、 扩容机制
- ArrayList动态扩容机制
- ArrayList扩容机制
- StringBuffer、StringBuilder、ArrayList、Vector、HashMap、HashTable是如何扩容的
- ArrayList的初始化和扩容解读
- ArrayList,HashMap,LinkedList 初始化大小和 扩容机制
- Spark SQL 简单使用
- HBase开发SQL查询中间件之查询原理
- sql高性能触发器
- CSDN, cnblog, iteye和51cto四个博客网站的比较与分析
- 利用nginx向现有网站添加登录验证功能(不添加修改现有网站代码)
- ArrayList和Vector的扩容机制
- php中实现精确设置session过期时间的方法
- cocos2d-x bindings-generator(lua调用c++)
- easyui-添加输入框可带小数点的数字验证条件
- iOS10的适配总结
- English in November
- 数据结构-顺序栈
- 敏捷之伤——燃尽图
- iOS与JS交互