a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 118|回复: 0

[其他] JAVA技巧:Java中的静态数组与动态数组

[复制链接]
发表于 2012-8-4 12:28:23 | 显示全部楼层 |阅读模式
我们进修的数组都是静态数组,其其实良多的时辰,静态数组根柢不能知足我们编程的现实需要,例如说我需要在轨范运行过程中动态的向数组中添加数据,这时我们的静态数组巨细是固定的,显然就不能添加数据,要动态添加数据必需要用到动态数组,动态数组中的各个元素类型也是一致的,不外这种类型已经是用一个很是年夜的类型来揽括—Object类型。     Object类是JAVA.LANG包中的顶层超类。所有的类型都可以与Object类型兼容,所以我们可以将任何Object类型添加至属于Object类型的数组中,能添加Object类型的的集结有ArrayList、Vector及LinkedList,它们对数据的存放形式仿造于数组,属于集结类,下面是他们的特点:
) Z5 p# J( C' Y    特点一、容量扩充性
% t: v2 o! L; N; v    年夜内部实现机制来讲ArrayList和Vector都是使用Objec的数组形式来存储的。当你向这两种类型中增添元素的时辰,如不美观元素的数目超出了内部数组今朝的长度它们都需要扩展内部数组的长度,Vector缺盛意形下自动增添原本一倍的数组长度,ArrayList是原本的50%,所以最后你获得的这个集结所占的空间老是比你现实需要的要年夜。所以如不美观你要在集结中保留年夜量的数据那么使用Vector有一些优势,因为你可以经由过程设置集结的初始化巨细来避免不需要的资本开销。0 F7 K8 Q4 b$ c/ k9 d5 N
    特点二、同步性
! U* ^' U1 U6 \" E$ o2 s    ArrayList,LinkedList是分歧步的,而Vestor是的。所以如不美观要求线程平安的话,可以使用ArrayList或LinkedList,可以节约为同步而破耗开销。但在多线程的情形下,有时辰就不得不使用Vector了。当然,也可以经由过程一些法子包装ArrayList,LinkedList,使他们也达到同步,但效率可能会有所降低。
8 u9 z" A- ]7 X. ^2 s! _9 ^    特点三、数据操作效率
% q' y+ f: D) v- y5 x0 C    ArrayList和Vector中,年夜指定的位置(用index)检索一个对象,或在集结的末尾插入、删除一个对象的时刻是一样的,可暗示为O(1)。可是,如不美观在集结的其他位置增添或移除元素那么破耗的时刻会呈线形增添:O(n-i),其中n代表集结中元素的个数,i代表元素增添或移除元素的索引位置。为什么会这样呢?觉得在进行上述操作的时辰集结中第i和第i个元素之后的所有元素都要执行(n-i)个对象的位移操作。
& F- Z# E* S, \/ i  L  V; D    LinkedList中,在插入、删除集结中任何位置的元素所破耗的时刻都是一样的—O(1),但它在索引一个元素的时辰斗劲慢,为O(i),其中i是索引的位置。
$ A9 l/ e  Z$ k9 @- o' _    所以,如不美观只是查找特定位置的元素或只在集结的结尾增添、移除元素,那么使用Vector或ArrayList都可以。如不美观是对其它指定位置的插入、删除操作,最浩揭捉择LinkedList" Y9 c; ?1 Q2 g( ^2 M; S) ~4 Z- h
    ArrayList 和Vector是采用数组体例存储数据,此数组元素数年夜于现实存储的数据以便增添和插入元素,都许可直接序号索引元素,可是插入数据要设计到数组元素移动等内存操作,所以索引数据快插入数据慢,Vector因为使用了synchronized体例(线程平安)所以机能上比ArrayList要差,LinkedList使用双向链表实现存储,顺次号索引数据需要进行向前或向后遍历,可是插入数据时只需要记实本项的前后项即可,所以插入数度较快。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-4 12:38 , Processed in 0.200541 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表