|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
在ruby里才是一切皆对象。当然我不并不是很了解ruby,但是ruby确实是将语法简化得很好。
对我来讲,汇合类属于最壮大的一种工具,出格合适在原创编程中利用。人人大概已感到到我对Java1.1供应的汇合几有点儿扫兴。因而,看到Java1.2对汇合从头引发了准确的注重后,的确使人十分兴奋。这个版本的汇合也失掉了完整的从头计划(由Sun公司的JoshuaBloch)。我以为新计划的汇合是Java1.2中两项最次要的特征之一(另外一项是Swing库,将在第13章叙说),由于它们极小气便了我们的编程,也使Java酿成一种更成熟的编程体系。
有些计划使得元素间的分离变得更严密,也更简单让人了解。比方,很多名字都变得更短、更明白了,并且更容易利用;范例一样云云。有些名字举行了修正,更靠近于普通:我感到出格好的一个是用“重复器”(Inerator)取代了“列举”(Enumeration)。
此次从头计划也增强了汇合库的功效。如今新增的举动包含链接列表、行列和取消组队(即“双尽头行列”)。
汇合库的计划是相称坚苦的(会碰到大批库计划成绩)。在C++中,STL用多个分歧的类来掩盖基本。这类做法比起STL之前是个很年夜的前进,当时基本没做这方面的思索。但仍旧没有很好地转换到Java内里。了局就是一年夜堆出格简单搅浑的类。在另外一个极度,我曾发明一个汇合库由单个类组成:colleciton,它同时作为Vector和Hashtable利用。新汇合库的计划者则但愿到达一种新的均衡:完成人们但愿从一个成熟汇合库上取得的完全功效,同时又要比STL和其他相似的汇合库更容易进修和利用。如许失掉的了局在某些场所显得有些乖僻。但和初期Java库的一些决议分歧,这些乖僻的地方并不是偶尔呈现的,而是以庞大性作为价值,在举行细心衡量以后失掉的了局。如许做大概会延伸人们把握一些库观点的工夫,但很快就会发明本人很乐于利用那些新工具,并且变得愈来愈离不了它。
新的汇合库思索到了“包容本人对象”的成绩,并将其支解成两个明白的观点:
(1)汇合(Collection):一组独自的元素,一般使用了某种划定规矩。在这里,一个List(列表)必需按特定的按次包容元素,而一个Set(集)不成包括任何反复的元素。相反,“包”(Bag)的观点未在新的汇合库中完成,由于“列表”已供应了相似的功效。
(2)映照(Map):一系列“键-值”对(这已在散列表身上失掉了充实的表现)。从外表看,这仿佛应当成为一个“键-值”对的“汇合”,但倘使试图按那种体例完成它,就会发明完成历程相称愚笨。这进一步证实了应当分别成独自的观点。另外一方面,能够便利地检察Map的某个部分。只需创立一个汇合,然后用它暗示那一部分便可。如许一来,Map就能够前往本人键的一个Set、一个包括本人值的List大概包括本人“键-值”对的一个List。和数组类似,Map可便利扩大到多个“维”,毋需触及任何新观点。只需复杂地在一个Map里包括其他Map(后者又能够包括更多的Map,以此类推)。
Collection和Map可经由过程多种情势完成,详细由编程请求决意。上面列出的是一个匡助人人了解的新汇合表示图:
<br>
这张图刚入手下手的时分大概让人有点儿摸不着思想,但在通读了本章今后,信任人人会真正了解它实践只要三个汇合组件:Map,List和Set。并且每一个组件实践只要两、三种完成体例(正文⑥),并且一般都只要一种出格好的体例。只需看出了这一点,汇合就不会再使人生畏。
⑥:写作本章时,Java1.2尚处于β测试阶段,以是这张表示图没有包含今后会到场的TreeSet。
虚线框代表“接口”,点线框代表“笼统”类,而实线框代表一般(实践)类。点线箭头暗示一个特定的类筹办完成一个接口(在笼统类的情形下,则是“部分”完成一个接口)。双线箭头暗示一个类可天生箭头指向的谁人类的对象。比方,任何汇合都能够天生一个重复器(Iterator),而一个列表能够天生一个ListIterator(和原始的重复器,由于列表是从汇合承继的)。
努力于包容对象的接口是Collection,List,Set和Map。在传统情形下,我们必要写大批代码才干同这些接口打交道。并且为了指定本人想利用的正确范例,必需在创立之初举行设置。以是大概创立上面如许的一个List:
Listx=newLinkedList();
固然,也能够决意将x作为一个LinkedList利用(而不是一个一般的List),并用x负载正确的范例信息。利用接口的优点就是一旦决意改动本人的实行细节,要做的全体事变就是在创立的时分改动它,就象上面如许:
Listx=newArrayList();
其他代码能够坚持一成不变。
在类的分级布局中,可看到大批以“Abstract”(笼统)开首的类,这刚入手下手大概会令人感到利诱。它们实践上是一些工具,用于“部分”完成一个特定的接口。举个例子来讲,假设想天生本人的Set,就不是从Set接口入手下手,然后自行完成一切办法。相反,我们能够从AbstractSet承继,只需少少的事情便可失掉本人的新类。只管云云,新汇合库仍旧包括了充足的功效,可满意我们的几近一切需求。以是思索到我们的目标,可疏忽一切以“Abstract”开首的类。
因而,在寓目这张表示图时,真正必要体贴的只要位于最顶部的“接口”和一般(实践)类——均用实线方框包抄。一般必要天生实践类的一个对象,将其上溯外型为对应的接口。今后便可在代码的任何中央利用谁人接口。上面是一个复杂的例子,它用String对象添补一个汇合,然后打印出汇合内的每个元素:
- //:SimpleCollection.java
- //AsimpleexampleusingthenewCollections
- packagec08.newcollections;
- importjava.util.*;
- publicclassSimpleCollection{
- publicstaticvoidmain(String[]args){
- Collectionc=newArrayList();
- for(inti=0;i<10;i++)
- c.add(Integer.toString(i));
- Iteratorit=c.iterator();
- while(it.hasNext())
- System.out.println(it.next());
- }
- }///:~
复制代码
新汇合库的一切代码示例都置于子目次newcollections下,如许即可提示本人这些事情只关于Java1.2无效。如许一来,我们必需用下述代码来挪用程序:
javac08.newcollections.SimpleCollection
接纳的语法与其他程序是差未几的。
人人能够看到新汇合属于java.util库的一部分,以是在利用时不必要再增加任何分外的import语句。
main()的第一行创立了一个ArrayList对象,然后将其上溯外型成为一个汇合。因为这个例子只利用了Collection办法,以是从Collection承继的一个类的任何对象都能够一般事情。但ArrayList是一个典范的Collection,它取代了Vector的地位。
明显,add()办法的感化是将一个新元素置进汇合里。但是,用户文档审慎地指出add()“包管这个汇合包括了指定的元素”。这一点是为Set作展垫的,后者只要在元素不存在的条件下才会真的到场谁人元素。关于ArrayList和其他任何情势的List,add()一定意味着“间接到场”。
使用iterator()办法,一切汇合都能天生一个“重复器”(Iterator)。重复器实在就象一个“列举”(Enumeration),是后者的一个替换物,只是:
(1)它接纳了一个汗青上默许、并且早在OOP中失掉普遍采取的名字(重复器)。
(2)接纳了比Enumeration更短的名字:hasNext()取代了hasMoreElement(),而next()取代了nextElement()。
(3)增加了一个名为remove()的新办法,可删除由Iterator天生的上一个元素。以是每次挪用next()的时分,只需挪用remove()一次。
在SimpleCollection.java中,人人可看到创立了一个重复器,并用它在汇合里遍历,打印出每一个元素。
Java编译的是字节码,跟C++相反,启动不够快,效率不够高,难以精确控制内存,但是优点是编程比C++容易,代码比较安全但是容易留下性能隐患,跨平台靠字节码在各个平台复制(一处编译到处调试) |
|