ArrayList与Vector源码解析与区别

DELPHI11 利用Android手机实现条码扫描功能 好了,整个过程全部结束,当然这只是最简单的例子,只是演示一下如何识别条码,更多的条码处理功能,比如优化,提速等需要在后面继续。安装过程中所有提示框全部按OK就可以,直到提示安装成功,那么ZXing库就成功完成了安装。点击红框标识的文件夹图标,将下载的ZXing库文件路径加入进来后,点ADD。第三步:选择下载的ZXing库路径,并按Ctrl + A进行全选,并导入。至此为止,我们的库才算是全部安装完成,可以在DELPHI 中正常引用了。2.打开相机,识别条码,并将条码内容显示在MEMO1中。 阅读详情

ArrayList


1、ArrayList介绍

        ArrayList是一种线性数据结构,它的底层是用数组实现的,相当于动态数组。与Java中的数组相比,它的容量能动态增长,默认容量大小为10

    private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
     
     transient Object[] elementData;    
    /**
     * 构造初始容量为10的空列表。本质上为一个数组结构的集合
     */
    public ArrayList() {
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }

       当创建一个数组的时候,就必须确定它的大小,系统会在内存中开辟一块连续的空间,用来保存数组,因此数组容量固定且无法动态改变。ArrayList在保留数组可以快速查找的优势的基础上,弥补了数组在创建后,要往数组添加元素的弊端。实现的基本方法如下: 

1. 快速查找:在物理内存上采用顺序存储结构,因此可根据索引快速的查找元素。

2. 容量动态增长: 当数组容量不够用时,创建一个比原数组容量大的新数组(原来的一半),将数组中的元素复制到新数组,再将新数组赋给原数组成员变量,最后将新元素放进数组中。源码如下:

    //将数据增加到集合中
    public boolean add(E e) {
        //确定ArrayList的容量大小
        ensureCapacityInternal(size + 1);  // Increments modCount!!
       //添加e到ArrayList中
        elementData[size++] = e;
        return true;
    }

    //返回容器元素数量,加入新元素后的容量跟初始化容量对比
    private static int calculateCapacity(Object[] elementData, int minCapacity) {
          if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
              return Math.max(DEFAULT_CAPACITY, minCapacity);
          }
          return minCapacity;
     }

     private void ensureCapacityInternal(int minCapacity) {
           ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
     }

     private void ensureExplicitCapacity(int minCapacity) {
          modCount++;

            // 判断容器是否溢出,即超出初始化大小,超出就自动增加容量
            if (minCapacity - elementData.length > 0)
                grow(minCapacity);
    }
    
    /**
     * 增加容量,以确保它至少可以容纳由minimum capacity参数指定的元素数。
     *
     * @param minCapacity the desired minimum capacity
     */
    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);
        // 创建新的数组(大小为newCapacity),将原数组中的元素复制到新数组,并将新数组赋值给elementData 成员变量,
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

总结,向集合中添加元素实现动态规则如下步骤:

(1)判断集合元素的个数与集合初始化大小对比

(2)增加元素后的个数大于默认容器大小,则创建新数组(数组大小为原来的一半),并将原数组元素复制到新数组中

(3)将新创建的数组赋予集合中数组成员变量elementData 

(4)数组成员变量接受新元素

2、ArrayList遍历方式

(1) 第一种,通过迭代器遍历。即通过Iterator去遍历。

Integer value = null;
Iterator iter = list.iterator();
while (iter.hasNext()) {
    value = (Integer)iter.next();
}

(2) 第二种,通过索引值去遍历。

Integer value = null;
int size = list.size();
for (int i=0; i<size; i++) {
    value = (Integer)list.get(i);        
}

(3) 第三种,for循环遍历。如下:

Integer value = null;
for (Integer integ:list) {
    value = integ;
}

比较这3种方式的效率:,遍历ArrayList时,使用随机访问(即,通过索引序号访问)效率最高,而使用迭代器的效率最低!

3、ArrayList线程不安全

略

4、ArrayList性能分析

(1)查询速度快

          ArrayList底层本身以数组的结构存储数据,初始化时默认创建容量为10的数组,并具有一个的排列顺序。通过索引能快速定位到数组的具体位置,并获取到该位置上的元素;

(2)增加或删除元素时,操作的位置不同,对数组存储数据的性能影响也不用

         当在数组的尾部新增(或删除)元素,则在该位置上直接添加新元素(或删除、清空该元素),其他的位置上的数组元素保持不变,操作的速度非常的快;

        但是,当新增(或删除)的元素位置不在首尾两端,而是在其中的某一个位置,则这过程将涉及到数组元素的内存问题,新增或删除指定位置的元素时,后面的元素将向前移动位置,填充该位置,达到数组的连续性,在元素移动位置过程中,将大大的降低了数组存储数据的效率;


Vector

1、Vector本质上为动态数组结构,默认容量为10,其的构造函数如下:

    /**
     * Constructs an empty vector so that its internal data array
     * has size {@code 10} and its standard capacity increment is
     * zero.
     */
    public Vector() {
        this(10);
    }

    public Vector(int initialCapacity) {
        this(initialCapacity, 0);
    }
    
    public Vector(int initialCapacity, int capacityIncrement) {
        super();
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        this.elementData = new Object[initialCapacity];
        this.capacityIncrement = capacityIncrement;
    }

2、添加元素时,线程安全

    /**
     * Appends the specified element to the end of this Vector.
     *
     * @param e element to be appended to this Vector
     * @return {@code true} (as specified by {@link Collection#add})
     * @since 1.2
     */
    public synchronized boolean add(E e) {
        modCount++;
        //判断容器大小,是否溢出,过程类似于ArrayLIst
        ensureCapacityHelper(elementCount + 1);
        elementData[elementCount++] = e;
        return true;
    }

3、Vector与ArrayList的区别

(1)同步性:

        Vector集合线程安全,效率低;ArrayList线程不安全,效率高

(2)数据增长规则(容器扩张规则)

         Vector与ArrayList的默认容器大小均为10,可自定义容器大小,不同之处在于:当增加的元素超出容量本身的大小时,集合容器大小自动动态的增长,Vector容器增加为原来的一倍,ArrayList容器增加为原来的一半

4、ArrayList,Vector, LinkedList的存储性能和特性

         ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据便自动扩容,以增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。

LinkedList也是线程不安全的,LinkedList提供了一些方法,使得LinkedList可以被当作堆栈和队列来使用

【同等学力】2005-数学⭐✨ 有r个正方形排成一行,今用红、黄、白、蓝四种颜色给这个r个正方形染色,每个正方形只能染一种颜色,如果要求染红、黄、白色的正方形分别至少出现一个,问有多少种不同的染法?3、(4分)设G是一个有n个结点m条边的连通简单平面图,若n≥3,则m≤3n-6.4、(4分)证明:任何连通简单平面图至少有一个结点的度数不超过5 阅读详情

相关推荐

如何使用3D高斯分布进行环境建模

使用3D高斯分布来进行建模,关键在于通过引入不确定性描述来提高建图的鲁棒性和精度。与传统点云表示相比,3D高斯分布提供了一种更为灵活和有效的方式来处理空间数据,能够通过协方差矩阵表示点的空间不确定性,帮助优化SLAM过程中的定位和地图更新。

JaydenQ的博客 2356

源码分析三(Vector与ArrayList的区别)

 前面讨论过ArrayList与LinkedList的区别,ArrayList的底层数据结构是数组Object[],而LinkedList底层维护 的是一个链表Entry,所以对于查询,肯定是ArrayList的效率高,但是对于删除和插入则是LinedList效率高。 现在我们再来看看Vector与ArrayList的区别,直接上源码,ArrayList源码: 1:扩容方面,ArrayList扩容...

weixin_34116110的博客 94

Claude Code长期记忆:优雅的上下文管理

ClaudeCode的上下文管理系统采用三层架构设计,通过智能压缩和优化策略在记忆容量与性能间取得平衡。系统包含短期记忆(高速工作区)、中期记忆(智能蒸馏器)和长期记忆(持久化知识库)。当Token使用率达到92%阈值时启动wU2压缩器,采用8段式结构化摘要保留关键信息,并配合智能文件恢复和渐进式预警机制。该系统通过分层处理、优雅降级和透明化交互,为AI应用提供了高效可靠的上下文管理方案,展现了在有限资源下实现智能记忆的艺术。

m0_53117338的博客 3820

Vector源码解读以及与ArrayList的区别

1、概述 Vector和ArrayList类似,内部也是维护一个Object的数组 protected Object[] elementData,也允许null存在.其实现了 List<E>、RandomAccess、Cloneable、java.io.Serializable.内部的方法和ArrayList一样的,只是加上 synchronized 关键字, 保证线程安全. 需要深入了解它,便要从成员变量、构造方法、主要方法深入 2、成员变量 protected Object..

兮遥 349

win2016 php mysql_Windows Server 2016 IIS10.0+PHP(FastCGI)+MySQL环境搭建教程 | 系统运维...

准备篇一、环境说明:操作系统:Windows Server 2016PHP版本:php 7.1.0MySQL版本:MySQL 5.7.17.0二、相关软件下载:1、PHP下载地址:2、MySQL下载地址:3、Microsoft Visual C++ 2010 可再发行组件包(安装MySQL需要此插件)4、Visual C++ Redistributable for Visual Studio 20...

weixin_34794420的博客 1378

普通人如何上岸华为OD-面试总结

总共有3道算法题,100分值的两道,200分值的一道,不同的毕业院校和专业,通过机试的分值不一样,最少需要150分通过,提前和hr联系,了解自己需要多少分通过。重中之重:哪怕你是背的题库,也请你一定不要直接抄原来的,最好是变更下方法名,否则会判定你重复率过高,从而失去后面的面试机会(实在是不会做再用此方法,凑分数所用,面试官能看到你的代码,会影响你的面试评价)本人女,所以还问道了婚育计划,有对象这点可以说,没有问题,但是如果可以的话,生孩子的时间,可以给hr说这几年不考虑。如果说没有难题,直接就挂了。

weixin_47767264的博客 5457

Vector源码分析以及ArrayList比较

源码分析如下: package easyExcel; import java.util.Vector; public class VectorDemo { public static void main(String[] args) { /** protected Object[] elementData; 数组存储元素 ...

heqingzhou的博客 204

Brainstorm简单分析近红外数据(fNIRS)(一)

Brainstorm分析fNIRS数据

weixin_43604817的博客 1352

ArrayList和Vector的区别(源码分析比较)

ArrayList Vector 1、实现原理:采用动态对象数组实现,默认构造方法创建了一个空数组 1:实现原理:采用动态数组对象实现,默认构造方法创建了一个大小为10的对象数组 2、第一次添加元素,扩展容量为10,之后的扩充算法:原来数组大小+原来数组的一半 2、扩充的算法:当增量为0时,扩充为原来大小的2倍,当增量大于0时,扩充为原来大小+增量 3、不适合进行删除或插入...

u011419651的博客 7080

放弃FFT全频计算!在STM32F407上用DFT单点计算提速50%的优化技巧

本文详细介绍了在STM32F407上通过DFT单点计算实现比FFT快50%的优化技巧,特别适用于生物阻抗分析、振动监测等只需关注单一频点的嵌入式场景。通过预计算相位角、查表法和混合精度计算等策略,显著提升计算效率和内存利用率,同时保持高精度。

weixin_28738397的博客 195

本地如何安装midscene.js运行环境

手把手教你本地安装midscene.js运行环境

实践助梦想成长 2610

ArrayList实现源码分析&与Vector的区别

以数组实现。节约空间,但数组有容量限制。超出限制时会增加50%容量,用System.arraycopy()复制到新的数组,因此最好能给出数组大小的与估值。默认第一次插入元素是创建大小为10的数组。 按数组下标访问元素-get(i)/set(i,e)的性能很高,这是数组的基本优势。直接在数组末尾加入元素-add(e)的性能也很高,但如果按下标插入,删除元素--add(i,e),remove(i),remove(e)则要

风雨雾凇的博客 624

ultralytics.data.utils——utils.py子模块代码详读

ultralytics.data.utils——utils.py子模块代码详读

Together_CZ的博客 1721

Nhibernate的问题,请哪位大虾帮忙????

        在10。1时我无意间发现一个不错的OpenSource的架构Nhibernate,我研究了一天,并且我现在按照http://nhibernate.sourceforge.net/quickstart.html网站的步骤做了实验,但不知为什么总是编译错误,请大家帮忙。一、代码如下1.数据库的建立use NHibernategoCREATE TABLE users (  LogonID...

weixin_34153893的博客 130

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

C++中可排列相等请朋友举个列子帮忙解释一下????

请朋友们帮忙解释一下 “可排列相等”问题????在c++中实现的。。。。。。   谢谢!!!!

流渊的专栏 1649

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

请使用 WITH MOVE 选项来标识该文件的有效位置。 问题????

<br />“/”应用程序中的服务器错误。<br /> --------------------------------------------------------------------------------<br /><br /> 无法覆盖文件 'E:/YH2010721/YH2010721/CashierSystem.mdf'。数据库 'CashierSystem' 正在使用该文件。<br /> 文件 'CashierSystem' 无法还原为 'E:/YH2010721/YH201072

2641

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

梯控时间2032.0.-32????请大神帮忙看看

0 扇区1 扇区2 扇区3 扇区4 扇区5 扇区6 扇区7 扇区8 扇区9 扇区10 扇区11 扇区12 扇区13 扇区14 扇区15 扇区。

ggk7933aaa的博客 944

编程之路第17天:不能在ui线程执行阻塞操作,请使用setTimeout代替????

如何解决呢!!!!

liweizhou1991的博客 3841

java flash socket_Flash和Java的socket通讯部分????请高手指教!!!

Flash部分代码:btn.addEventListener(MouseEvent.CLICK,myConnect);varsocket:Socket=newSocket();functionmyConnect(event:Event):void{socket.addEventListener(ProgressEvent.SOCK...Flash部分代码:btn.addEventListener(...

weixin_31128057的博客 96

php select只有一条_读取数据库如何只取出一条数据????请赐教!

该楼层疑似违规已被系统折叠隐藏此楼查看此楼感谢大家的帮助,我的问题解决了!核心代码如下:if($_POST) {if($_POST['select'] === '') {echo('alert ("请不要查询空信息!");');}else {$select = "select * from `tbl_name`";$query = mysql_query($select);while($fetc...

weixin_31437187的博客 2761

php如何逐条读取数据库,读取数据库如何只取出一条数据????请赐教!

该楼层疑似违规已被系统折叠隐藏此楼查看此楼感谢大家的帮助,我的问题解决了!核心代码如下:if($_POST) {if($_POST['select'] === '') {echo('alert ("请不要查询空信息!");');}else {$select = "select * from `tbl_name`";$query = mysql_query($select);while($fetc...

weixin_30595763的博客 275

请大神留言:使用static方法和从Spring IOC 容器里面取出的方法有什么区别????...

类的静态方法,不用new出对象,因为它在类的初始化阶段加载到jvm内存的。 而spring容器,是在启动服务的时候,new出容器所管理的对象。 本质区别就是一个在堆中产生了对象,一个没产生对象只在方法栈中有了方法。 对吗?大神请留言 转载于:https://www.cnblogs.com/beixiaoyi/p/9895498.html...

weixin_30507269的博客 338

php获取数据库的某条信息,读取数据库如何只取出一条数据????请赐教!

该楼层疑似违规已被系统折叠隐藏此楼查看此楼感谢大家的帮助,我的问题解决了!核心代码如下:if($_POST) {if($_POST['select'] === '') {echo('alert ("请不要查询空信息!");');}else {$select = "select * from `tbl_name`";$query = mysql_query($select);while($fetc...

weixin_39706127的博客 742

php读取数据库前几条,读取数据库如何只取出一条数据????请赐教!

该楼层疑似违规已被系统折叠隐藏此楼查看此楼感谢大家的帮助,我的问题解决了!核心代码如下:if($_POST) {if($_POST['select'] === '') {echo('alert ("请不要查询空信息!");');}else {$select = "select * from `tbl_name`";$query = mysql_query($select);while($fetc...

weixin_32330765的博客 172

Sql Server 中image类型迁移到Oracle 中Blob类型出现图片显示不出来,why????请博客们帮忙...

我现在在一项目中碰到这么一个问题Sql Server 中image类型迁移到Oracle Blob类型出现图片显示不出来,我在Sql Server 中看了一条image数据如下:1。Sql Server中select datalength(d.photo) from drivers d where d.Name like '%陆斌%'输出如下132727select d.photo from dr...

weixin_30871701的博客 404
上一篇: 使用 final 关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
下一篇: LinkedList基本原理,与ArrayList的区别
Array*
博客等级 码龄9年 2粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值