|  首页  |  资讯  |  评测  |  活动  |  学院  |  访谈  |  专题  |  杂志  |  产服  |  
您现在的位置:硅谷网> 资讯> 软件>

硅谷杂志:Java中顺序表与向量应用浅析

2012-12-11 12:14 作者:龙 军 来源:硅谷网 HV: 编辑: 【搜索试试
  [硅谷网12月11日文] 据《硅谷》杂志2012年第18期刊文,对顺序表与向量做简单介绍,着重比较两者的数据结构、容量增长、线程安全性和运行效率,得出各自适用范围,并通过示例方便读者了解两者的应用。
  程序设计语言中通过数组将若干同类型数据有序的集合在一起,各元素位置固定,元素个数就是数组的长度。但当集合中删除或插入元素时,数组就显得捉襟见肘,c++使用链表,Java先是用向量(Vector),后又可通过顺序表(ArrayList)完成。Vector和ArrayList均可保存一列数据,并提供众多方法来操作这些数据。在JDK1.5之后,Vector被重新设计为泛型,成为AbstractList的子类,实现了Iterator接口,与集合充分兼容。
  1顺序表(ArrayList)与向量(Vector)的基本概念
  ArrayList是一个泛型类,支持动态数组,通过类型参数表示其存储元素的类型。它预先给ArrayList对象分配存储空间,插入元素时,若空间不够则自动增加空间,删除时则自动减少空间。ArrayList常用的方法有add(插入)、get(获得)、remove(删除)、set(设置)、size(获得容量)等。
  Vector继承自AtrastractList,实现了Serializable,Cloneable,Iterable,Collection,List,RandomAccess的接口,是曾经使用最为广泛的顺序表。Vector常用的方法除了ArrayList的还有addElement(增加)、elementAt(获得)、indexOf和lastindexOf(查找)、setSize(设置容量)等,并含有capacityIncrement(容量增长数目)、elementCount(元素数目)、elementData(数据实际存储区域)3个成员变量。
  2顺序表(ArrayList)与向量(Vector)的比较
  2.1ArrayList与Vector的数据结构比较
  ArrayList和Vector均将数据存储在私有的Object数组中,ArrayList源代码是:“privatetransientObjectelementData[];”,Vector源代码是:“protectedObjectelementData[];”。在增加数据时(如用add()及addAll()),先判断elementData[]的大小是否够用,若不够则构造一更大的数组,用System.arraycopy()将原数组elementData[]拷贝到这个数组中,并把add()的参数增加进去。
  2.2容量增长算法比较
  ArrayList和Vector内部都用数组存储对象,但在构造新数组确定容量时采用了不同的算法。Vector通过私有成员变量“capacityIncrement”进行控制,当数组大小不够时,若capacityIncrement为正数,新数组容量增加capacityIncrement;若capacityIncrement为非正,新数组容量将扩容为原数组的两倍。源代码见下表:
  intoldCapacity=elementData.length;
  intnewCapacity=(capacityIncrement>0)?(oldCapacity+capacityIncrement)
  :(oldCapacity*2);
  ArrayList扩充数组容量时均按照新数组容量是原数组1.5倍的原则进行。源代码如下:intnewCapacity=(oldCapacity*3)/2+1;
  当遇到添加元素过多,如调用addAll()方法,元素个数超过新数组容量时,Vector和ArrayList都会自动再扩容到新数组要求的最小容量。源代码如下:
  if(newCapacity<minCapacity)newCapacity=minCapacity;
  2.3线程的安全性比较
  Vector是线程安全的,它通过同步机制保证多个线程存储时不会出现错误。而ArrayList没有使用同步机制,适合单线程的存储,效率更高。
  2.4运行效率比较
  当查找一个指定位置的元素或在末尾增加、移除一个元素时,ArrayList和Vector所需时间相同。当在其他位置增加或移除元素时,时间则呈线形增长,这时一般选择其他的集合操作类。
  3使用顺序表(ArrayList)和向量(Vector)的示例
  笔者通过模拟扑克发牌进行ArrayList和Vector应用研究和比较。程序用了3个类,“play”类主程序生成玩家和发牌机的对象,开启发牌机并显示扑克牌;“wj”类描述玩家获得的牌,并进行排序;“fp”类用于发牌,在构造方法中分别用ArrayList或Vector生成52张扑克牌,在“get_card”方法中用随机算法依次抽出牌你提出给玩家,每抽出一张牌,发牌机的容量自动减1。
  1.使用顺序表编写的fp类:
  importjava.util.ArrayList;
  importjava.util.Random;
  publicclassfp{
  ArrayList<Integer>a;
  publicfp(){
   a=newArrayList<Integer>(52);
   for(inti=0;i<52;i++)
    a.add(newInteger(i));}
  publicintget_card(){
   intindex=-1;
   Randomr=newRandom();
   inti=r.nextInt(a.size());
   index=((Integer)a.get(i)).intValue();
   a.remove(i);
   returnindex;}} 2.使用Vector编写的fp类:
  importjava.util.Random;
  importjava.util.Vector;
  publicclassfp{
  Vector<Integer>v;
  publicfp(){
  v=newVector<Integer>(52);
  for(inti=0;i<52;i++)
   v.addElement(newInteger(i));}
  publicintget_card(){
  intindex=-1;
  Randomr=newRandom();
  inti=r.nextInt(v.size());
  index=((Integer)v.elementAt(i)).intValue();
  v.removeElementAt(i);
   returnindex;}}
  程序运行结果
  
  4顺序表(ArrayList)与向量(Vector)的比较结论
  Vector通过同步机制保证多个线程存储时不会出现错误,但效率下降,而ArrayList不使用同步机制,适合单线程的存储。
  当集合中元素数目大于当前集合数组的长度时,Vector增长率为现长度的100%,而Arraylist增长率为现长度的50%,但Vector可以通过设置成员变量“capacityIncrement”的值控制增加量。所以当使用数据量较大时,用Vector可以节省资源开销。
  作者简介:
  龙军(1971-),男,安徽安庆人,本科,讲师,研究方向:计算机应用技术。
  
【对“硅谷杂志:Java中顺序表与向量应用浅析”发布评论】

版权及免责声明:
① 本网站部分投稿来源于“网友”,涉及投资、理财、消费等内容,请亲们反复甄别,切勿轻信。本网站部分由赞助商提供的内容属于【广告】性质,仅供阅读,不构成具体实施建议,请谨慎对待。据此操作,风险自担。
② 内容来源注明“硅谷网”及其相关称谓的文字、图片和音视频,版权均属本网站所有,任何媒体、网站或个人需经本网站许可方可复制或转载,并在使用时必须注明来源【硅谷网】或对应来源,违者本网站将依法追究责任。
③ 注明来源为各大报纸、杂志、网站及其他媒体的文章,文章原作者享有著作权,本网站转载其他媒体稿件是为传播更多的信息,并不代表赞同其观点和对其真实性负责,本网站不承担此类稿件侵权行为的连带责任。
④ 本网站不对非自身发布内容的真实性、合法性、准确性作担保。若硅谷网因为自身和转载内容,涉及到侵权、违法等问题,请有关单位或个人速与本网站取得联系(联系电话:01057255600),我们将第一时间核实处理。
广告
相关
·MIUI 11开发版内测招募开启 抢先尝鲜最新功能
·补齐短板:苹果机顶盒引进亚马逊的视频服务
·火狐弃雅虎与谷歌签约,火狐成功拓展加拿大市场
·苹果专利之争,被指控屏幕共享技术专利侵权
·特斯拉汽车系统更新 冷静模式使加速更加缓慢
·Snap第三季度业绩不佳 阅后即焚应用将重新设计
·马斯克:特斯拉完全自动驾驶硬件条件已经具备
·三星加大对AI芯片的投资与研发,欲赶超iPhoneX
头条
多种流行iOS应用程序未经用户同意读取剪贴板内容 多种流行iOS应用程序未经用户同意读取剪贴板
据Macrumors报道,最新研究显示数十种流行的iOS应用程序,在未经用户同意的情况下,读……
·多种流行iOS应用程序未经用户同意读取剪贴板
·苹果应用商店禁止非官方新型冠状病毒相关应用
·微软终止支持Windows 7数月 Windows 7仍占市
·苹果新增多项审核条例,微信适配速度不敌What
·“魔搜”软件开发者张某被判刑1年2个月缓刑1
图文
多种流行iOS应用程序未经用户同意读取剪贴板内容
多种流行iOS应用程序未经用户同意读取剪贴
喜报I纷享销客携手飞书深诺集团构建多元化数字经营体系
喜报I纷享销客携手飞书深诺集团构建多元化
知米背单词APP那些不为人知的小细节(图)
知米背单词APP那些不为人知的小细节(图)
Realme引入广告什么情况 Realme广告怎么设置关闭?
Realme引入广告什么情况 Realme广告怎么设
最新
·多种流行iOS应用程序未经用户同意读取剪贴板内容
·喜报I纷享销客携手飞书深诺集团构建多元化数字经
·狂奔之后RPA企业开始精耕细作:建生态、补短板、
·微软子公司GitHub同意收购代码分发初创公司NPM
·喜报:纷享销客携手深诺集团构建多元化数字经营体
热点
·群控、云控时代即将终结,智控时代已到来
·106短信群发平台APP,致力于成为领域内佼佼者
·DT小听App:防偷拍,还是用这款国产app(图)
·软件技术行业发展变化非常快,软件人才要按需
·嗨学网一级消防可靠吗?新手妈妈亲生经历告诉
旧闻
·360手机助手安全播报:警惕二把刀GPS导航软件
·陌陌成色情交易重灾地 移动端色情交易亟待封
·Q立方2.0 beta1新版发布:新增语音助手
·用户称iOS 8.1仍然没有解决iPad蓝屏问题
·智慧商贸进销存“慧”营销 商品套餐灵活销售
广告
硅谷影像
多种流行iOS应用程序未经用户同意读取剪贴板内容
多种流行iOS应用程序未经用户同意读取剪贴板内容
喜报I纷享销客携手飞书深诺集团构建多元化数字经营体系
喜报I纷享销客携手飞书深诺集团构建多元化数字经
狂奔之后RPA企业开始精耕细作:建生态、补短板、推进市场落地
狂奔之后RPA企业开始精耕细作:建生态、补短板、
微软子公司GitHub同意收购代码分发初创公司NPM
微软子公司GitHub同意收购代码分发初创公司NPM
喜报:纷享销客携手深诺集团构建多元化数字经营体系
喜报:纷享销客携手深诺集团构建多元化数字经营体
苹果加强管控 多款iOS应用盗取用户隐私存安全隐患
苹果加强管控 多款iOS应用盗取用户隐私存安全隐患
关于我们·About | 联系我们·contact | 加入我们·Join | 关注我们·Invest | Site Map | Tags | RSS Map
电脑版·PC版 移动版·MD版 网站热线:(+86)010-57255600
Copyright © 2007-2020 硅谷网. 版权所有. All Rights Reserved. <京ICP备12003855号-2>