新调集[Java编程]
本文“新调集[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
对我来说,调集类属于最强盛的一种工具,分外合适在原创编程中利用.大家大概已感遭到我对Java 1.1供应的调集多少有点儿绝望.因此,看到Java 1.2对调集重新惹起了精确的注意后,确切令人非常高兴.这个版本的调集也得到了完好的重新计划(由Sun公司的Joshua Bloch).我认为新计划的调集是Java 1.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可通过量种情势实现,具体由编程要求决意.下面列出的是一个帮忙大家理解的新调集表示图:
这张图刚开始的时刻大概让人有点儿摸不着头脑,但在通读了本章今后,相信大家会真正理解它实际只有三个调集组件:Map,List和Set.并且每个组件实际只有两、三种实现方法(注释⑥),并且普通都只有一种分外好的方法.只要看出了这一点,调集就不会再令人生畏.
⑥:写作本章时,Java 1.2尚处于β测试阶段,所以这张表示图没有包含今后会加入的TreeSet.
虚线框代表“接口”,点线框代表“抽象”类,而实线框代表普通(实际)类.点线箭头表示一个特定的类预备实现一个接口(在抽象类的情形下,则是“部份”实现一个接口).双线箭头表示一个类可生成箭头指向的那个类的对象.比方,任何调集都可以生成一个反复器(Iterator),而一个列表可以生成一个ListIterator(以及原始的反复器,因为列表是从调集担当的).
努力于包容对象的接口是Collection,List,Set和Map.在传统情形下,我们需求写大量代码才能同这些接口打交道.并且为了指定自己想利用的精确范例,必须在成立之初举行设置.所以大概成立下面这样的一个List:
List x = new LinkedList();
当然,也可以决意将x作为一个LinkedList利用(而不是一个普通的List),并用x负载精确的范例信息.利用接口的好处就是一旦决意改变自己的实施细节,要做的全部事情就是在成立的时刻改变它,就象下面这样:
List x = new ArrayList();
别的代码可以保持原封不动.
在类的分级构造中,可看到大量以“Abstract”(抽象)开首的类,这刚开始大概会令人感受迷惑.它们实际上是一些工具,用于“部份”实现一个特定的接口.举个例子来说,假定想生成自己的Set,就不是从Set接口开始,然后自行实现全部办法.相反,我们可以从AbstractSet担当,只需极少的工作便可得到自己的新类.固然如此,新调集库仍旧包含了充足的功效,可满意我们的几近全部需求.所以考虑到我们的目的,可忽视全部以“Abstract”开首的类.
因此,在傍观这张表示图时,真正需求关心的只有位于最顶部的“接口”以及普通(实际)类——均用实线方框包抄.普通需求生成实际类的一个对象,将其上溯造型为对应的接口.今后便可在代码的任何地方利用那个接口.下面是一个简单的例子,它用String对象填充一个调集,然后打印出调集内的每一个元素:
新调集库的全部代码示例都置于子目录newcollections下,这样便可提醒自己这些工作只关于Java 1.2有效.这样一来,我们必须用下述代码来调用程序://: SimpleCollection.java // A simple example using the new Collections package c08.newcollections; import java.util.*; public class SimpleCollection { public static void main(String[] args) { Collection c = new ArrayList(); for(int i = 0; i < 10; i++) c.add(Integer.toString(i)); Iterator it = c.iterator(); while(it.hasNext()) System.out.println(it.next()); } } ///:~
java c08.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编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |
- ·上一篇文章:<b>java的collections调集</b>
- ·下一篇文章:<b>java的通用调集库</b>
- ·中查找“新调集”更多相关内容
- ·中查找“新调集”更多相关内容