还剩17页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
j__a中的__类总结2008年09月28日星期日下午12:39在使用J__a的时候,我们都会遇到使用__(Collection)的时候,但是J__aAPI提供了多种__的实现,我在使用和面试的时候频频遇到这样的“抉择”:)(主要还是面试的时候)久而久之,也就有了一点点的心得体会,写出来以供大家讨论总的说来,J__aAPI中所用的__类,都是实现了Collection接口,他的一个类继承结构如下Collection--List--VectorCollection--List--ArrayListCollection--List--LinkedListCollection--Set--HashSetCollection--Set--HashSet--LinkedHashSetCollection--Set--SortedSet--TreeSetVector:基于Array的List,其实就是封装了Array所不具备的一些功能方便我们使用,它不可能走入Array的限制性能也就不可能超越Array所以,在可能的情况下,我们要多运用Array另外很重要的一点就是Vector“sychronized”的,这个也是Vector和ArrayList的唯一的区别ArrayList同Vector一样是一个基于Array上的链表,但是不同的是ArrayList不是同步的所以在性能上要比Vector优越一些,但是当运行到多线程环境中时,可需要自己在管理线程的同步问题LinkedList LinkedList不同于前面两种List,它不是基于Array的,所以不受Array性能的限制它每一个节点(Node)都包含两方面的内容
1.节点本身的数据(data);
2.下一个节点的信息(nextNode)所以当对LinkedList做添加,删除动作的时候就不用像基于Array的List一样,必须进行大量的数据__只要更改nextNode的相关信息就可以实现了这就是LinkedList的优势List总结
1.所有的List中只能容纳单个不同类型的对象组成的表,而不是Key-Value键值对例如[tom1c];
2.所有的List中可以有相同的元素,例如Vector中可以有[tomkootookoo];
3.所有的List中可以有null元素,例如[tomnull1];
4.基于Array的List(Vector,ArrayList)适合查询,而LinkedList(链表)适合添加,删除操作HashSet虽然Set同List都实现了Collection接口,但是他们的实现方式却大不一样List基本上都是以Array为基础但是Set则是在Hash__p的基础上来实现的,这个就是Set和List的根本区别HashSet的存储方式是把Hash__p中的Key作为Set的对应存储项看看HashSet的add(O__ecto__)方法的实现就可以一目了然了publicbooleanaddO__ecto__{return__p.puto__PRESENT==null;}这个也是___在Set中不能像在List中一样有重复的项的根本原因,因为Hash__p的key是不能有重复的LinkedHashSet HashSet的一个子类,一个链表TreeSet SortedSet的子类,它不同于HashSet的根本就是TreeSet是有序的它是通过Sorted__p来实现的Set总结
1.Set实现的基础是__p(Hash__p);
2.Set中的元素是不能重复的,如果使用addO__ecto__方法添加已经存在的对象,则会覆盖前面的对象___要使用__类当你事先不知道要存放数据的个数,或者你需要一种比数组下标存取机制更灵活的方法时,你就需要用到__类理解__类__类存放于j__a.util包中__类存放的都是对象的引用,而非对象本身,出于表达上的便利,我们称__中的对象就是指__中对象的引用(referen____类型主要有3种set集)、list列表)和__p映射1集集(set)是最简单的一种__,它的对象不按特定方式排序,只是简单的把对象加入__中,就像往口袋里放东西对集中成员的访问和操作是通过集中对象的引用进行的,所以集中不能有重复对象集也有多种变体,可以实现排序等功能,如TreeSet,它把对象添加到集中的操作将变为按照某种比较规则将其插入到有序的对象序列中它实现的是SortedSet接口,也就是加入了对象比较的方法通过对集中的对象迭代,我们可以得到一个升序的对象__2列表列表的主要特征是其对象以线性方式存储,没有特定顺序,只有一个开头和一个结尾,当然,它与根本没有顺序的集是不同的列表在数据结构中分别表现为数组和向量、链表、堆栈、队列关于实现列表的__类,是我们日常工作中经常用到的,将在后边的笔记详细介绍3映射映射与集或列表有明显区别,映射中每个项都是成对的映射中存储的每个对象都有一个相关的关键字(Key)对象,关键字决定了对象在映射中的存储位置,检索对象时必须提供相应的关键字,就像在字典中查单词一样关键字应该是唯一的关键字本身并不能决定对象的存储位置,它需要对过一种散列hashing技术来处理,产生一个被称作散列码hashcode的整数值,散列码通常用作一个偏置量,该偏置量是相对于分配给映射的内存区域起始位置的,由此确定关键字/对象对的存储位置理想情况下,散列处理应该产生给定范围内均匀分布的值,而且每个关键字应得到不同的散列码__类简介j__a.util__有13个类可用于管理__对象,它们支持集、列表或映射等__,以下是这些类的简单介绍集HashSet使用Hash__p的一个集的实现虽然集定义成无序,但必须存在某种方法能相当高效地找到一个对象使用一个Hash__p对象实现集的存储和检索操作是在固定时间内实现的.TreeSet在集中以升序对对象排序的集的实现这意味着从一个TreeSet对象获得第一个迭代器将按升序提供对象TreeSet类使用了一个Tree__p.列表Vector实现一个类似数组一样的表,自动增加容量来容纳你所需的元素使用下标存储和检索对象就象在一个标准的数组中一样你也可以用一个迭代器从一个Vector中检索对象Vector是唯一的同步容器类当两个或多个线程同时访问时也是性能良好的Stsck:这个类从Vector派生而来,并且增加了方法实现栈一种后进先出的存储结构LinkedList:实现一个链表由这个类定义的链表也可以像栈或队列一样被使用ArrayList:实现一个数组,它的规模可变并且能像链表一样被访问它提供的功能类似Vector类但不同步映射HashTable实现一个映象,所有的键必须非空为了能高效的工作,定义键的类必须实现hashcode方法和equal方法这个类是前面j__a实现的一个继承,并且通常能在实现映象的其他类中更好的使用Hash__p实现一个映象,允许存储空对象,而且允许键是空(由于键必须是唯一的,当然只能有一个)WeakHash__p实现这样一个映象通常如果一个键对一个对象而言不再被引用,键/对象对将被舍弃这与Hash__p形成对照,映象中的键维持键/对象对的生命周期,尽管使用映象的程序不再有对键的引用,并且因此不能检索对象Tree__p实现这样一个映象,对象是按键升序排列的Set和List都是由公共接口Collection扩展而来,所以它们都可以使用一个类型为Collection的变量来引用这就意味着任何列表或集构成的__都可以用这种方式引用,只有映射类除外(但也不是完全排除在外,因为可以从映射获得一个列表)所以说,把一个列表或集传递给方法的标准途径是使用Collection类型的参数Vector还是ArrayList,哪一个更好,___?要回答这个问题不能一概而论,有时候使用Vector比较好;有时是ArrayList,有时候这两个都不是最好的选择你别指望能够获得一个简单肯定答案,因为这要看你用它们干什么下面有4个要考虑的因素1API2同步处理3数据增长性4使用模式下面针对这4个方面进行一一探讨API在由KenArnold等编著的《J__aProgrammingLanguage》Addison-WesleyJune2000一书中有这样的描述,Vector类似于ArrayList.所有从API的角度来看这两个类非常相似但他们之间也还是有一些主要的区别的同步性Vector是同步的这个类中的一些方法保证了Vector中的对象是线程安全的而ArrayList则是异步的,因此ArrayList中的对象并不是线程安全的因为同步的要求会影响执行的效率,所以如果你不需要线程安全的__那么使用ArrayList是一个很好的选择,这样可以避免由于同步带来的不必要的性能开销数据增长从内部实现机制来讲ArrayList和Vector都是使用数组Array来控制__中的对象当你向这两种类型中增加元素的时候,如果元素的数目超出了内部数组目前的长度它们都需要扩展内部数组的长度,Vector缺省情况下自动增长原来一倍的数组长度,ArrayList是原来的50%所以最后你获得的这个__所占的空间总是比你实际需要的要大所以如果你要在__中保存大量的数据那么使用Vector有一些优势,因为你可以通过设置__的初始化大小来避免不必要的资源开销使用模式在ArrayList和Vector中,从一个指定的位置(通过索引)查找数据或是在__的末尾增加、移除一个元素所花费的时间是一样的,这个时间我们用O1表示但是,如果在__的其他位置增加或移除元素那么花费的时间会呈线形增长On-i,其中n代表__中元素的个数,i代表元素增加或移除元素的索引位置___会这样呢?以为在进行上述操作的时候__中第i和第i个元素之后的所有元素都要执行位移的操作这一切意味着什么呢?这意味着,你只是查找特定位置的元素或只在__的末端增加、移除元素,那么使用Vector或ArrayList都可以如果是其他操作,你最好选择其他的__操作类比如,LinkList__类在增加或移除__中任何位置的元素所花费的时间都是一样的—O1,但它在索引一个元素的使用缺比较慢-Oi其中i是索引的位置.使用ArrayList也很容易,因为你可以简单的使用索引来代替创建iterator对象的操作LinkList也会为每个插入的元素创建对象,所有你要明白它也会带来额外的开销最后,在《PracticalJ__a》一书中PeterHaggar建议使用一个简单的数组(Array)来代替Vector或ArrayList尤其是对于执行效率要求高的程序更应如此因为使用数组Array避免了同步、额外的方法调用和不必要的重新分配空间的操作T007importj__a.util.*;publicclassTestset{publicstaticvoid__inStringargs[]{Setset=newHashSet;set.addaaa;set.addbbb;set.addaaa;set.addbbb;set.addaaa;set.addbbb;set.addaaa;set.addbbb;set.addaaa;set.addbbb;Iteratorite=set.iterator;set.size;whileite.hasNextSystem.out.println------+ite.next;}}J__A中的__类我们看一个简单的例子,来了解一下__类的基本方法的使用importj__a.util.*;publicclassCollectionToArray{publicstaticvoid__inString[]args{Collectioncollection1=newArrayList;//创建一个__对象collection
1.add000;//添加对象到Collection__中collection
1.add111;collection
1.add222;System.out.println__collection1的大小+collection
1.size;System.out.println__collection1的内容+collection1;collection
1.remove000;//从__collection1中移除掉000这个对象System.out.println__collection1移除000后的内容+collection1;System.out.println__collection1中是否包含000+collection
1.contains000;System.out.println__collection1中是否包含111+collection
1.contains111;Collectioncollection2=newArrayList;collection
2.addAllcollection1;//将collection1__中的元素全部都加到collection2中System.out.println__collection2的内容+collection2;collection
2.clear;//清空__collection1中的元素System.out.println__collection2是否为空+collection
2.isEmpty;//将__collection1转化为数组O__ects[]=collection
1.toArray;forinti=0;i 运行结果为__collection1的大小3__collection1的内容
[000111222]__collection1移除000后的内容
[111222]__collection1中是否包含000false__collection1中是否包含111true__collection2的内容
[111222]__collection2是否为空true111222 这里需要注意的是,Collection它仅仅只是一个接口,而我们真正使用的时候,确是创建该接口的一个实现类做为__的接口,它定义了所有属于__的类所都应该具有的一些方法 而ArrayList(列表)类是__类的一种实现方式 下面,我们看一个对于迭代器的简单使用importj__a.util.ArrayList;importj__a.util.Collection;importj__a.util.Iterator;publicclassIteratorDemo{publicstaticvoid__inString[]args{Collectioncollection=newArrayList;collection.adds1;collection.adds2;collection.adds3;Iteratoriterator=collection.iterator;//得到一个迭代器whileiterator.hasNext{//遍历O__ectelement=iterator.next;System.out.printlniterator=+element;}ifcollection.isEmptySystem.out.printlncollectionisEmpty!;elseSystem.out.printlncollectionisnotEmpty!size=+collection.size;Iteratoriterator2=collection.iterator;whileiterator
2.hasNext{//移除元素O__ectelement=iterator
2.next;System.out.printlnremove:+element;iterator
2.remove;}Iteratoriterator3=collection.iterator;if!iterator
3.hasNext{//察看是否还有元素System.out.println还有元素;}ifcollection.isEmptySystem.out.printlncollectionisEmpty!;//使用collection.isEmpty方法来判断}} 程序的运行结果为iterator=s1iterator=s2iterator=s3collectionisnotEmpty!size=3remove:s1remove:s2remove:s3 还有元素 collectionisEmpty! 可以看到,J__a的Collection的Iterator能够用来, 1)使用方法 iterator()要求容器返回一个Iterator.第一次调用Iterator的next()方法时,它返回__序列的第一个元素 2)使用next()获得__序列的中的下一个元素 3)使用hasNext()检查序列中是否元素 4)使用remove()将迭代器新返回的元素删除 需要注意的是方法删除由next方法返回的最后一个元素,在每次调用next时,remove方法只能被调用一次. 大家看,J__a实现的这个迭代器的使用就是如此的简单Iterator(跌代器)虽然功能简单,但仍然可以帮助我们解决许多问题,同时针对List还有一个更复杂更高级的ListIterator.您可以在下面的List讲解中得到进一步的介绍 我们看一个List的例子importj__a.util.*;publicclassListIteratorTest{publicstaticvoid__inString[]args{Listlist=newArrayList;list.addaaa;list.addbbb;list.addccc;list.addddd;System.out.println下标0开始+list.listIterator
0.next;//nextSystem.out.println下标1开始:+list.listIterator
1.next;System.out.println子List1-3:+list.subList13;//子列表ListIteratorit=list.listIterator;//默认从下标0开始//隐式光标属性add操作插入到当前的下标的前面it.addsss;whileit.hasNext{System.out.printlnnextIndex=+it.nextIndex+O__ect=+it.next;}//set属性ListIteratorit1=list.listIterator;it
1.next;it
1.setooo;ListIteratorit2=list.listIteratorlist.size;//下标whileit
2.hasPrevious{System.out.printlnpreviousIndex=+it
2.previousIndex+O__ect=+it
2.previous;}}} 程序的执行结果为下标0开始aaa下标1开始:bbb子List1-3:[bbbccc]nextIndex=1O__ect=aaanextIndex=2O__ect=bbbnextIndex=3O__ect=cccnextIndex=4O__ect=dddpreviousIndex=4O__ect=dddpreviousIndex=3O__ect=cccpreviousIndex=2O__ect=bbbpreviousIndex=1O__ect=a
一、用得最多的主要有SetList__pIterator这几个接口Set和List接口都是Collection接口的子接口有很多相同的地方,我们只是撑握了Collection接口的方法,Set和List的用法也就差不多了. Set和List的区别
1、Set是没有顺序的,不能放重复的数据相同的数据
2、List是有顺序的,可以存放重复的数据相同的数据Set的实现类常用的主要有两个HashSet、TreeSet 我们可以把一类对象添加到__中,并且按对象的某一个属性进行排序(客户化排序和自然排序
1、对TreeSet集进行客户化排序要求写一个类实现Comparator接口,并且重写其中的Compare方法例: 客户化排序容易扩展,如果要按其它的属性排序,只需要重新写一个类实现Comparator接口就可以了, 不需要修改原来的代码 classUsers { privateStringname; privateintid; publicUsersStringnameintid { this.name=name; this.id=id; } publicvoidsetNameStringname { this.name=name; } publicStringgetName { returnname; } publicvoidsetIdintid { this.id=id; } publicintgetId { returnid; } //这里重写了父类的toString方法 publicStringtoString { returnthis.name+\t+this.id+\t; } } //这个类实现Comparator接口,并且重写了其中的compare方法 publicclassMyComparatorimplementsComparator { publicint compareO__ecto1O__ecto2 { Usersuser1=Userso1; Usersuser2=Userso2; ifuser
1.getIduser
2.getIdreturn1; elseifuser
1.getId==user
2.getIdreturn0; return-1; } } class TestComparator { publicstaticvoid__inStringargs[] { TestComparator.test; } publicstaticvoidtest { Set set=newTreeSetnewMyComparator; Usersuser1=new Users张三17; Usersuser2=new Users李四13; Usersuser3=new Users王五19; Usersuser5=newUsers王五19; set.adduser1; set.adduser2; set.adduser3; set.adduser5; forO__ecto__set { System.out.printlno__; } } }
2、自然排序,将需要排序的那个类实现Comparable接口并且重写其中的compareTo方法 例如下: classUsers implementsComparable { privateStringname; privateintid; publicUsersStringnameintid { this.name=name; this.id=id; } publicvoidsetNameStringname { this.name=name; } publicStringgetName { returnname; } publicvoidsetIdintid { this.id=id; } publicintgetId { returnid; } //这里重写了父类的toString方法 publicStringtoString { returnthis.name+\t+this.id+\t; } //重写compareTo方法 publicintcompareToO__ecto { UserBeanuser=UserBeano; ifthis.iduser.idreturn1; elseifthis.id==user.idreturn0; return-1; } }
3.如果是HashSet自然排序,则要求排序的类重写hashCode方法和equals方法
二、对List和Set集进行遍历 List集有三种方法进行遍历
1、通过下标遍历2使用迭代器进行遍历,
3、增强循环进行遍历 Listlist=newArrayList; list.addaa; list.addbb; list.addcc; forinti=0;ilist.size;i++ { System.out.printlnlist.geti; } Iteratorit=list.iterator; whileit.hasNext { System.out.printlnit.next; } forO__ecto__list { System.out.printlno__; }
三、Vector和ArrayList的区别:
1、Vector和ArrayList都实现了List接口,Vector是线程安全的,可以多个线程同时访问但性能比较差
2、ArrayList线程不安全,不支持多个线程同时访问,但性能比较好,访问的速度快
四、__p集是以键值对的形式存放的,键不可以重复,值可以重复,如果键重复,会将原来的值覆盖, __p集的实现类主要有三个:Hash__pTree__pHashTable Hash__p与HashTable的区别:
1、HashTable是线程安全的,支持同步
2、Hash__p线程不安全,不支持 同步,但性能比HashTable好 __p集的遍历
1、 __p__p=newHash__p __p.put1张飞; __p.put2关羽; __p.put3刘备; //得到键的__ Setset=__p.keySet; forO__ecto__set { System.out.println__p.geto__; }
2、 //得到健值对的__ Sets=__p.entrySet; forO__ecto__set { System.out.printlno__; }
五、对List集进行客户化排序,可以通过Collections类的sort方法,要求传一个List集和一个Comparator对象例 Listlist=newArrayList Usersuser1=new Users张三17; Usersuser2=new Users李四13; Usersuser3=new Users王五19; Usersuser5=newUsers王五19; list.adduser1; list.adduser2; list.adduser3; list.adduser5; Collections.sortlistnewMycomparator; Iteratorit=list.iterator; whileit.hasNext { System.out.printlnit.next; }J__A中的__类2007-01-0519:22:11 分类培训笔记___要使用__类当你事先不知道要存放数据的个数,或者你需要一种比数组下标存取机制更灵活的方法时,你就需要用到__类理解__类__类存放于j__a.util包中__类存放的都是对象的引用,而非对象本身,出于表达上的便利,我们称__中的对象就是指__中对象的引用(referen____类型主要有3种set集)、list列表)和__p映射1集集(set)是最简单的一种__,它的对象不按特定方式排序,只是简单的把对象加入__中,就像往口袋里放东西对集中成员的访问和操作是通过集中对象的引用进行的,所以集中不能有重复对象集也有多种变体,可以实现排序等功能,如TreeSet,它把对象添加到集中的操作将变为按照某种比较规则将其插入到有序的对象序列中它实现的是SortedSet接口,也就是加入了对象比较的方法通过对集中的对象迭代,我们可以得到一个升序的对象__2列表列表的主要特征是其对象以线性方式存储,没有特定顺序,只有一个开头和一个结尾,当然,它与根本没有顺序的集是不同的列表在数据结构中分别表现为数组和向量、链表、堆栈、队列关于实现列表的__类,是我们日常工作中经常用到的,将在后边的笔记详细介绍3映射映射与集或列表有明显区别,映射中每个项都是成对的映射中存储的每个对象都有一个相关的关键字(Key)对象,关键字决定了对象在映射中的存储位置,检索对象时必须提供相应的关键字,就像在字典中查单词一样关键字应该是唯一的关键字本身并不能决定对象的存储位置,它需要对过一种散列hashing技术来处理,产生一个被称作散列码hashcode的整数值,散列码通常用作一个偏置量,该偏置量是相对于分配给映射的内存区域起始位置的,由此确定关键字/对象对的存储位置理想情况下,散列处理应该产生给定范围内均匀分布的值,而且每个关键字应得到不同的散列码__类简介j__a.util__有13个类可用于管理__对象,它们支持集、列表或映射等__,以下是这些类的简单介绍集HashSet使用Hash__p的一个集的实现虽然集定义成无序,但必须存在某种方法能相当高效地找到一个对象使用一个Hash__p对象实现集的存储和检索操作是在固定时间内实现的.TreeSet在集中以升序对对象排序的集的实现这意味着从一个TreeSet对象获得第一个迭代器将按升序提供对象TreeSet类使用了一个Tree__p.列表Vector实现一个类似数组一样的表,自动增加容量来容纳你所需的元素使用下标存储和检索对象就象在一个标准的数组中一样你也可以用一个迭代器从一个Vector中检索对象Vector是唯一的同步容器类当两个或多个线程同时访问时也是性能良好的Stsck:这个类从Vector派生而来,并且增加了方法实现栈一种后进先出的存储结构LinkedList:实现一个链表由这个类定义的链表也可以像栈或队列一样被使用ArrayList:实现一个数组,它的规模可变并且能像链表一样被访问它提供的功能类似Vector类但不同步映射HashTable实现一个映象,所有的键必须非空为了能高效的工作,定义键的类必须实现hashcode方法和equal方法这个类是前面j__a实现的一个继承,并且通常能在实现映象的其他类中更好的使用Hash__p实现一个映象,允许存储空对象,而且允许键是空(由于键必须是唯一的,当然只能有一个)WeakHash__p实现这样一个映象通常如果一个键对一个对象而言不再被引用,键/对象对将被舍弃这与Hash__p形成对照,映象中的键维持键/对象对的生命周期,尽管使用映象的程序不再有对键的引用,并且因此不能检索对象Tree__p实现这样一个映象,对象是按键升序排列的Set和List都是由公共接口Collection扩展而来,所以它们都可以使用一个类型为Collection的变量来引用这就意味着任何列表或集构成的__都可以用这种方式引用,只有映射类除外(但也不是完全排除在外,因为可以从映射获得一个列表)所以说,把一个列表或集传递给方法的标准途径是使用Collection类型的参数Vector还是ArrayList,哪一个更好,___?要回答这个问题不能一概而论,有时候使用Vector比较好;有时是ArrayList,有时候这两个都不是最好的选择你别指望能够获得一个简单肯定答案,因为这要看你用它们干什么下面有4个要考虑的因素1API2同步处理3数据增长性4使用模式下面针对这4个方面进行一一探讨API在由KenArnold等编著的《J__aProgrammingLanguage》Addison-WesleyJune2000一书中有这样的描述,Vector类似于ArrayList.所有从API的角度来看这两个类非常相似但他们之间也还是有一些主要的区别的同步性Vector是同步的这个类中的一些方法保证了Vector中的对象是线程安全的而ArrayList则是异步的,因此ArrayList中的对象并不是线程安全的因为同步的要求会影响执行的效率,所以如果你不需要线程安全的__那么使用ArrayList是一个很好的选择,这样可以避免由于同步带来的不必要的性能开销数据增长从内部实现机制来讲ArrayList和Vector都是使用数组Array来控制__中的对象当你向这两种类型中增加元素的时候,如果元素的数目超出了内部数组目前的长度它们都需要扩展内部数组的长度,Vector缺省情况下自动增长原来一倍的数组长度,ArrayList是原来的50%所以最后你获得的这个__所占的空间总是比你实际需要的要大所以如果你要在__中保存大量的数据那么使用Vector有一些优势,因为你可以通过设置__的初始化大小来避免不必要的资源开销使用模式在ArrayList和Vector中,从一个指定的位置(通过索引)查找数据或是在__的末尾增加、移除一个元素所花费的时间是一样的,这个时间我们用O1表示但是,如果在__的其他位置增加或移除元素那么花费的时间会呈线形增长On-i,其中n代表__中元素的个数,i代表元素增加或移除元素的索引位置___会这样呢?以为在进行上述操作的时候__中第i和第i个元素之后的所有元素都要执行位移的操作这一切意味着什么呢?这意味着,你只是查找特定位置的元素或只在__的末端增加、移除元素,那么使用Vector或ArrayList都可以如果是其他操作,你最好选择其他的__操作类比如,LinkList__类在增加或移除__中任何位置的元素所花费的时间都是一样的—O1,但它在索引一个元素的使用缺比较慢-Oi其中i是索引的位置.使用ArrayList也很容易,因为你可以简单的使用索引来代替创建iterator对象的操作LinkList也会为每个插入的元素创建对象,所有你要明白它也会带来额外的开销最后,在《PracticalJ__a》一书中PeterHaggar建议使用一个简单的数组(Array)来代替Vector或ArrayList尤其是对于执行效率要求高的程序更应如此因为使用数组Array避免了同步、额外的方法调用和不必要的重新分配空间的操作。