正在加载图片...
Chapter 11: Collections of Objects 作边界检查,所以你可能会不知不觉就过了界1。而Java对数组和容器都 做边界检查:如果过了界,它就会给一个 RuntimeException。这种 异常表明这个错误是由程序员造成的,这样你就用不着再在程序里面检查 了(译者注:这里的原文有些模棱两可,我想他要表达的意思可能是以下 两种中的一个。一是指,你不用再作边界检查了;二是指,通过异常信 息,你就可以知道错误是由过界造成的,因而不用查源代码了)。顺便说 下,C++的 vector不作边界检查是为了速度;而在Java,不论是数 组或是用容器,你都得面对边界检查所带来的固定的性能下降。 本章所探讨的其它泛型容器类还包括List,Set和Map。它们处理对象 的时候就好像这些对象都没有自己的具体类型一样。也就是说,容器将它 所含的元素都看成是(ava中所有类的根类) object的。这样你只需创 建一种容器,就能把所有类型的对象全都放进去。从这个角度来看,这种 做法很不错(只是苦了 primitive。如果是常量,你还可以用Java的 primitive的 wrapper类;如果是变量,那就只能放到你自己的类里 了)。与其他泛型容器相比,这里体现出数组的第二个优势:创建数组的 时候,你也同时指明了它所持有的对象的类型(这又引出了第三点——数 组可以持有 primitives,而容器却不行)。也就是说,它会在编译的时候 作类型检査,从而防止你插入错误类型的对象,或者是在提取对象的时候 把对象的类型给搞错了。Java在编译和运行时都能阻止你将一个不恰当 的消息传给对象。所以这并不是说使用容器就有什么危险,只是如果编译 器能够帮你指定,那么程序运行会更快,最终用户也会较少受到程序运行 异常的骚扰。 从效率和类型检查的角度来看,使用数组总是没错的。但是,如果你在解 决一个更为一般的问题,那数组就会显得功能太弱了点。本章先讲数组, 然后集中精力讨论Java的容器类。 数组是第一流的对象 不管你用的是那种类型的数组,数组的标识符实际上都是一个“创建在堆 (heap)里的实实在在的对象的” reference。实际上是那个对象持有其他 对象的 reference。你既可以用数组的初始化语句,隐含地创建这个对 象,也可以用new表达式,明确地创建这个对象。只读的 length属性 能告诉你数组能存储多少元素。它是数组对象的一部分(实际上也是你唯 能访问的属性或方法)。‘[]’语法是另一条访问数组对象的途径。 下面这段程序演示了几种初始化数组的办法,以及如何将数组的 reference赋给不同的数组对象。此外,它还显示了,对象数组和 primitives数组在使用方法上几乎是完全相同。唯一的不同是,对象数组 持有 reference,而 primitive数组则直接持有值。 7/: c11: Arraysize. java 不过真的想知道 vector的容量有多大,还是有办法的,更何况at)方法确实做边界检查 第2页共106页 www.wgqqh.com/shhgs/tij.html emailshhgsasohu.comChapter 11: Collections of Objects 第 2 页 共 106 页 www.wgqqh.com/shhgs/tij.html email:shhgs@sohu.com 作边界检查,所以你可能会不知不觉就过了界1。而 Java 对数组和容器都 做边界检查;如果过了界,它就会给一个 RuntimeException。这种 异常表明这个错误是由程序员造成的,这样你就用不着再在程序里面检查 了(译者注:这里的原文有些模棱两可,我想他要表达的意思可能是以下 两种中的一个。一是指,你不用再作边界检查了;二是指,通过异常信 息,你就可以知道错误是由过界造成的,因而不用查源代码了)。顺便说 一下,C++的 vector 不作边界检查是为了速度;而在 Java,不论是数 组或是用容器,你都得面对边界检查所带来的固定的性能下降。 本章所探讨的其它泛型容器类还包括 List,Set 和 Map。它们处理对象 的时候就好像这些对象都没有自己的具体类型一样。也就是说,容器将它 所含的元素都看成是(Java 中所有类的根类)Object 的。这样你只需创 建一种容器,就能把所有类型的对象全都放进去。从这个角度来看,这种 做法很不错(只是苦了 primitive。如果是常量,你还可以用 Java 的 primitive 的 wrapper 类;如果是变量,那就只能放到你自己的类里 了)。与其他泛型容器相比,这里体现出数组的第二个优势:创建数组的 时候,你也同时指明了它所持有的对象的类型(这又引出了第三点 —— 数 组可以持有 primitives,而容器却不行)。也就是说,它会在编译的时候 作类型检查,从而防止你插入错误类型的对象,或者是在提取对象的时候 把对象的类型给搞错了。Java 在编译和运行时都能阻止你将一个不恰当 的消息传给对象。所以这并不是说使用容器就有什么危险,只是如果编译 器能够帮你指定,那么程序运行会更快,最终用户也会较少受到程序运行 异常的骚扰。 从效率和类型检查的角度来看,使用数组总是没错的。但是,如果你在解 决一个更为一般的问题,那数组就会显得功能太弱了点。本章先讲数组, 然后集中精力讨论 Java 的容器类。 数组是第一流的对象 不管你用的是那种类型的数组,数组的标识符实际上都是一个“创建在堆 (heap)里的实实在在的对象的”reference。实际上是那个对象持有其他 对象的 reference。你既可以用数组的初始化语句,隐含地创建这个对 象,也可以用 new 表达式,明确地创建这个对象。只读的 length 属性 能告诉你数组能存储多少元素。它是数组对象的一部分(实际上也是你唯 一能访问的属性或方法)。‘[]’语法是另一条访问数组对象的途径。 下面这段程序演示了几种初始化数组的办法,以及如何将数组的 reference 赋给不同的数组对象。此外,它还显示了,对象数组和 primitives 数组在使用方法上几乎是完全相同。唯一的不同是,对象数组 持有 reference,而 primitive 数组则直接持有值。 //: c11:ArraySize.java 1不过真的想知道 vector 的容量有多大,还是有办法的,更何况 at( )方法确实做边界检查
<<向上翻页向下翻页>>
©2008-现在 cucdc.com 高等教育资讯网 版权所有