Java语言与面向对象程序设计第10讲 对象的集合.ppt

Java语言与面向对象程序设计第10讲 对象的集合.ppt

Java编程思想 下面测试此新容器: 运行结果: Java编程思想 11.4迭代器 存放事物是容器最基本的工作。 对于ArrayList,add()是插入对象的方法,而get()是取出元素的方法之一。 如果你从更高层的角度思考,会发现这里有个缺点:要使用容器必须知道其中元素确切的类型。 如果原本是使用ArrayList,但是后来考虑到容器的特点,你想换用Set,应该怎么做?或者你打算写通用的代码,它只是使用容器,不知道或不关心容器的类型, 那么如何才能不重写代码就可以应用于不同类型的容器呢? Java编程思想 迭代器可以用来达成此目的。迭代器是一个对象,它的工作是遍历并选择序列中的对象。 Java的Iterator只能用来: 1. 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。 2.使用next()获得序列中的下一个元素。 3.使用hasNext()检查序列中是否还有元素。 4.使用remove()将上一次返回的元素从迭代器中移除。 Java编程思想 下面例子是使用Iterator: Java编程思想 下面是创建一个通用的打印方法的例子: 通过Iterator可以取得下一个对象,还可以知道是否到达了序列的底部。像这种“一次取出容器中的所有元素,然后一个一个进行单独处理”的思想是很有用的 Java编程思想 这个例子间接地使用了Object.toString()方法, 你也可以明确地作类型转换,效果与调用toString()相同: System.out.println((String)e.next()); 通常Object提供的方法并不能满足需求,所以又要考虑类型转换的问题了。你得假设你已经取得了某个特定类型的序列的Iterator,并将对结果对象作类型转换(如果类型错误会得到一个运行期异常)。 Java编程思想 我们可以通过打印Hamster试试看: Java编程思想 运行结果: Java编程思想 无意识中造成的递归 由于Java标准容器继承自Object,所以它们都有toString()方法。重载过的toString()生成可以代表容器自身的String,以及容器持有的对象。 例如,ArrayList的toString()方法遍历ArrayList的所有元素,对每个元素都调用toString()。 假设你要打印类的地址,见下例,你可能会简单地使用this关键字: Java编程思想 如果直接创建一个InfiniteRecursion对象,然后打印它,你会收到一个无穷无尽的异常序列。问题在于: InfiniteRecursion address: + this 编译器见到String后跟着一个’+’号,而’+’后的对象却不是String,于是编译器尝试将this转变成String类型。此类型转换操作调用的是toString()方法,于是产生递归调用。 在此例中,使用super.toString()取代this即可。 Java编程思想 11.5容器的分类法 为满足编程的需求,Collection和Map有多种不同的实现。 下图对于掌握Java (JDK 1.4)的众多容器将很有帮助: Java编程思想 Java编程思想 三种容器:Map,List和Set, 点线方框表示接口,虚线方框表示抽象类,实线方框表示普通的(具体的)类。 点线箭头代表特定的类实现一个接口(若是抽象类,则表示部分实现了接口)。实线箭头表示一个类可以生成箭头所指向类的对象。 与持有对象有关的接口是Collection,List,Set和Map。最理想的情况是,你的代码只与这些接口打交道,仅在创建容器的时候说明容器的特定类型。因此可以这样创建一个List: List x = new LinkedList(); 接口的优美之处(或者说目的)在于,如果你决定改变当前的实现,只需要在创建的位置做些修改即可,就像这样: List x = new ArrayList(); 而其它代码则无需改动(迭代器也能实现部分通用性)。 Java编程思想 抽象类只是部分实现了某个特定接口的简单工具而已。 举个例子,如果要制作自己的Set,一般不会直接继承Set接口,然后实现所有的方法。而是应该继承AbstractSet,只为自己的新类作最必要的工作。不过,容器类类库已经包含足够的功能来满足你的需要了。所以,对我们而言,可以忽略那些以”Abstract”开头的类。 因此,再看上图时,我们只关心顶层的接口和“具体类”(由实线方框表示)。 典型情况是你会生成一个“具体类”的对象,然后将它向上转型为对应的接口,在代码中使用接口操作它。此外,新的程序

文档评论(0)

1亿VIP精品文档

相关文档