资讯专栏INFORMATION COLUMN

ArrayList和Vector的区别

wawor4827 / 1163人阅读

摘要:扩容不同内部属性不同,这可能是导致扩容方式不同的原因所在。有两个属性,存储数据的数组,和存储记录数目的。将上面生成的新数组长度与传递的参数长度作比较,较大者为最终的新长度。

相同点:

1、ArrayList和Vector都是继承了相同的父类和实现了相同的接口

2、底层都是数组实现的

3、初始默认长度都为10。

不同点:

1、同步性:

Vector中的public方法多数添加了synchronized关键字,以确保方法同步,也即是Vector线程安全,ArrayList线程不安全。

2、扩容不同

内部属性不同,这可能是导致扩容方式不同的原因所在。

ArrayList有两个属性,存储数据的数组elementData,和存储记录数目的size。 

Vector有三个属性,存储数据的数组elementData,存储记录数目的elementCount,还有扩展数组大小的扩展因子capacityIncrement。 

ArrayList的扩展方法

//jdk1.8.0_91
private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        // minCapacity is usually close to size, so this is a win:
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

可以看出,在满足扩容条件时,扩展后数组大小为(原数组长度的1.5倍)与传递参数中较大者 

Vector的扩展方法

//jdk1.8.0_91
private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
                                         capacityIncrement : oldCapacity);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

可以看出,当扩容因子大于0时,新数组长度为原数组长度+扩容因子,否则子新数组长度为原数组长度的2倍。 将上面生成的新数组长度与传递的参数长度作比较,较大者为最终的新长度。

微信公众号:志哥 (ID: zhige-me)
期待与你相遇,一同成长前行!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/65228.html

相关文章

  • List集合就这么简单【源码剖析】

    摘要:线程不安全底层数据结构是链表。的默认初始化容量是,每次扩容时候增加原先容量的一半,也就是变为原来的倍删除元素时不会减少容量,若希望减少容量则调用它不是线程安全的。 前言 声明,本文用得是jdk1.8 前一篇已经讲了Collection的总览:Collection总览,介绍了一些基础知识。 现在这篇主要讲List集合的三个子类: ArrayList 底层数据结构是数组。线程不安全 ...

    cpupro 评论0 收藏0
  • Week 2 - Java 容器 - 详细剖析 List 之 ArrayList, Vector,

    摘要:底层使用的是双向链表数据结构之前为循环链表,取消了循环。快速随机访问就是通过元素的序号快速获取元素对象对应于方法。而接口就是用来标识该类支持快速随机访问。仅仅是起标识作用。,中文名为双端队列。不同的是,是线程安全的,内部使用了进行同步。 前言 学习情况记录 时间:week 2 SMART子目标 :Java 容器 记录在学习Java容器 知识点中,关于List的需要重点记录的知识点。...

    MartinDai 评论0 收藏0
  • Java编程基础16——Colletion集合

    摘要:集合的长度的是可变的,可以根据元素的增加而增长。如果元素个数不是固定的推荐用集合。线程安全,效率低。相对查询慢线程安全的相对增删慢数组结构底层数据结构是链表,查询慢,增删快。线程不安全,效率高。 1_对象数组的概述和使用 A:案例演示 需求:我有5个学生,请把这个5个学生的信息存储到数组中,并遍历数组,获取得到每一个学生信息。 import net.allidea.bean.Stu...

    TerryCai 评论0 收藏0
  • java 编程思想 - Chapter11&Chapter17- 不同容器之间比较

    摘要:中所有方法都是直接或者间接同步的,所以是线程安全的即多个线程操作同一个对象时是线程安全的,但是只有一个线程操作时考虑到同步控制会耗费系统资源所以效率低。中的所有方法都是线程非同步的,但有多个线程操作时是不安全的。 虽是读书笔记,但是如转载请注明出处http://segmentfault.com/blog/exploring/ ..拒绝伸手复制党 容器之间的区别通常归结为:由什么在背...

    imtianx 评论0 收藏0
  • 关于java集合框架总结

    摘要:是哈希表实现的,中的数据是无序的,可以放入,但只能放入一个,两者中的值都不能重复,就如数据库中唯一约束。四和的相同点和区别相同两者都是基于哈希表实现的内部也都是通过单链表解决冲突问题同样实现了序列化和克隆接口区别继承的父类不同。 一.Arraylist与LinkedList有什么区别? 1、ArrayList是实现了基于动态数组的数据结构,因为地址连续,一旦数据存储好了,查询操作效率...

    Coding01 评论0 收藏0

发表评论

0条评论

wawor4827

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<