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

  [硅谷网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-),男,安徽安庆人,本科,讲师,研究方向:计算机应用技术。

  

时间: 2024-08-02 18:43:18

硅谷杂志:Java中顺序表与向量应用浅析的相关文章

Java中form表单submit之后数据发生了重置。

问题描述 Java中form表单submit之后数据发生了重置. 在java中我用form表单提交后,页面等于刷新了,等于按了一次F5,所以刚才填写的数据会初始化,也就是说刚才选择的数据全部丢失了,现在除了用ajax无刷新提交外,怎么让点击submit按钮后,数据还保留??!(不要告诉我把数据放到session中,这样做是不科学的,另外加重页面刷新速度,只是投机取巧,谁有好的方法????) 解决方案 将表单提交到隐藏的iframe也行,不一定就是ajax <iframe style="di

java中form表单提交时Action传入不同的对象

问题描述 java中form表单提交时Action传入不同的对象 如题 在我点保存的时候进入action时传参(参数是实体类),参数有可能是不同的实体类, 解决方案 使用hashmap,hashmap的key是属性,value是属性值.在服务器端通过反射给属性赋值/取值/遍历属性. 解决方案二: 可以通过jquery $(""#id"").attr(""action""xxxxx"")然后再$("

Java 中 Form表单数据的两种提交方式_java

1 GET - 从指定的服务器中获取数据 1.1 GET方法 使用GET方法时,查询字符串(键值对)被附加在URL地址后面一起发送到服务器,例如:http://localhost:8080//customer/customer_info?res=json&mt=0&custId=1 1.2 特点 (1) GET请求能够被缓存 (2) GET请求会保存在浏览器的浏览记录中 (3) 以GET请求的URL能够保存为浏览器书签 (4) GET请求有长度限制(不能多于1024字节) (5) GET请

java中基于表单的文件上传例子

如果在表单中使用表单元素 <input type="file" />,浏览器在解析表单时,会自动生成一个输入框和一个按钮,输入框可供用户填写本地文件的文件名和路径名,按钮可以让浏览器打开一个文件选择框供用户选择文件: 当表单需要上传文件时,需指定表单 enctype 的值为 multipart/form-data 在 form 元素的语法中,enctype 属性指定将数据发送到服务器时浏览器使用的编码类型. enctype 属性取值: application/x-www-f

Java中的对象和对象引用实例浅析

  本文实例讲述了Java中的对象和对象引用.分享给大家供大家参考.具体分析如下: 在Java中,有一组名词经常一起出现,它们就是"对象和对象引用",很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起了解一下对象和对象引用之间的区别和联系. 1.何谓对象? 在Java中有一句比较流行的话,叫做"万物皆对象",这是Java语言设计之初的理念之一.要理解什么是对象,需要跟类一起结合起来理解.下面这段话引自<Jav

Java中的对象和对象引用实例浅析_java

本文实例讲述了Java中的对象和对象引用.分享给大家供大家参考.具体分析如下: 在Java中,有一组名词经常一起出现,它们就是"对象和对象引用",很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起了解一下对象和对象引用之间的区别和联系. 1.何谓对象? 在Java中有一句比较流行的话,叫做"万物皆对象",这是Java语言设计之初的理念之一.要理解什么是对象,需要跟类一起结合起来理解.下面这段话引自<Java编

Java中BEAN与EJB的区别浅析_java

Java Bean 是可复用的组件,对Java Bean并没有严格的规范,理论上讲,任何一个Java类都可以是一个Bean.但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以Java Bean应具有一个无参的构造器,另外,通常Java Bean还要实现Serializable接口用于实现Bean的持久性.Java Bean实际上相当于微软COM模型中的本地进程内COM组件,它是不能被跨进程访问的.Enterprise Java Bean 相当于DCOM,即分布式组件.它

Java中HashMap和Hashtable的区别浅析_java

HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable. HashMap允许将null作为一个entry的key或者value,而Hashtable不允许. HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey.因为contains方法容易让人引起误解. Hashtable继承自Dict

java-JAVA关于顺序表操作的问题。求大牛

问题描述 JAVA关于顺序表操作的问题.求大牛 public class StudScore { String name; int studentNo; double score; public StudScore() { } public StudScore(String name, int studentNo, double score) { this.name = name; this.studentNo = studentNo; this.score = score; } public