- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
java对象容器
java对象容器
2006年09月21日 星期四 下午 07:50
?????? 数组与其它容器的区别体现在三个方面:效率,类型识别以及可以持有primitives.
数组是java提供的,是能随机存储和访问reference序列的诸多方法中,最高效的一种。数组是线形序列,所以它可以快速访问其中的元素,但速度是有代价的,当你创建了一个数组之后它的容量就固定了,而且在其生命周期里不能改变。也许你会提议先创建一个数组,等到快不够用的时候,再创建一个新的,然后将旧数组里的reference 全部导到新的里面。其实ArrayList 就是这么做的。但是这种灵活性所带来的开销,使得ArrayList 的效率比?????? 起数组有了明显下降。??????
在我们写程序的时候往往不知道要用多少对象,或者要用一种更复杂方式来存储对象情况。为此,Java 提供了“容器类(container class)”。其基本类型有List, Set 和Map。有了这些工具,你就能解决很多问题了。它们还有一些别的特性。比方说Set 所持有的对象,个个都不同,Map则是一个“关联性数组(associative array)”,它能在两个对象之间建立联系。此外,与数组不同,它们还能自动调整大小,所以你可以往里面放任意数量的对象。这样写程序的时候,就不用操心要开多大的空间了。
?
Java2 的容器类要解决“怎样持有对象”,而它把这个问题分成两类:
1. Collection: 通常是一组有一定规律的独立元素。List 必须按照特定的顺序持有这些元素,而Set 则不能保存重复的元素。(bag没有这个限制,但是Java的容器类库没有实现它,因为List 已经提供这种功能了。)
2. Map: 一组以“键——值”(key-value)形式出现的pair。初看上去,它应该是一个pair的Collection,但是真这么去做的话,它就会变得很滑稽,所以还是把这个概念独立列出来为好。退一步说,真的要用到Map 的某个子集的时候,创建一个Collection 也是很方便的。Map可以返回“键(key)的”Set,值的Collection,或者pair的Set。和数组一样,Map 不需要什么修改,就能很容易地扩展成多维。你只要直接把Map 的值设成Map 就可以了(然后它的值再是Map,以此类推)。我们先来看看容器的一般特性,然后深入细节,最后再看什么会有这么多版本,以及如何进行选择。
?
List 会老老实实地持有你所输入的所有对象,既不做排序也不做编辑。Set 则每个对象只接受一次,而且还要用它自己的规则对元素进行重新排序(一般情况下,你关心的只是Set 包没包括某个对象,而不是它到底排在哪里——如果是那样,你最好还是用List)。而Map 也不接收重复的pair,至于是不是重复,要由key来决定。此外,它也有它自己的内部排序规则,不会受输入顺序影响。如果插入顺序是很重要的,那你就只能使用LinkedHashSet 或LinkedHashMap 了。
第一眼看到这张图的时候,你会觉得很震撼。不过你马上就会知道,实际上只有三种容器组件——Map,List 和Set,而每种又有两到三个实现。最常用的几个容器已经用粗黑线框了起来。看到这里,这张图就不再那么令人望而生畏了。用点号框起来的是interface,用虚线框起来的是abstract 类,实线则表示普通的(“实体concrete”)类。点线的箭头表示类实现了这个interface(或者,abstract 类表示部分实现了这个interface)。实线箭头表示这个类可以制造箭头所指的那个类的对象。比如,Collection能制造Iterator,而List 还能制造ListIterator(也能制造Iterator,因为List 是继承自Collection 的)。与存放对象有关的接口包括Collection,List,Set 和Map。在理想情况下,绝大多数代码应该只同这些接口打交道,只是在创建容器的时候才要精确地指明它的确切类型。所以你可以这样创建一个List。List x = new LinkedList( );当然,你也可以选择让x 成为LinkedList(而不是泛型的List),这样x 就带上了准确的类型信息interface 的优雅 (同时也是它的本意)就在于,你想修改具体的实现的时候,只要改一下创建的声明就可以了,就像这样:List x = new ArrayList( );无需惊动其它代码(用迭代器也能获得一些这种泛型性)。这个类系里面有很多以“Abstract”开头的类,初看起来这可能会让人有点不明白。实际上它们只是一些部分实现某个接口的办成品。假如你要编一个你自己的Set,不要从
文档评论(0)