总结:本小节先给出了一个简单而经典的实现,然后从泛型、调整数据大小、对象游离、迭代方面讨论它的改进。
重点:
1. 定容栈:
· 只能处理String值
· 要求用例指定一个容量
· 不支持迭代
2. 我们希望用以下代码在FixCapacityStack的构造函数的实现中创建一个泛型的数组:
a = new Item[cap];
由于某些历史和技术原因(不在本书讲解范围之内),创建泛型数组在Java中是不允许的。我们需要使用类型转换:
a = (Item[]) new Object[cap];
这段代码才能达到我们所期望的效果(但Java编译器会给出一条警告,不过可以忽略它),我们在本书中会一直使用这种方法(Java系统库中类似抽象数据类型的实现中也使用了相同的方式)。
3. 选择用数组表示栈意味着用例必须预先估计栈的最大容量。
4. 我们可以修改数组的实现,动态调整数组a[]的大小,使得它既足以保存所有的元素,又不至于浪费过多的空间:
如果没有多余的空间,我们会将数组的长度加倍;
如果栈大小小于数组的四分之一,我们会将数组的长度减半。
在这个实现中,栈永远不会溢出,使用率也永远不会低于四分之一(除非栈为空,那种情况下数组的大小为1)。
课本中有源代码,充分理解!
5. 即使用例已经不再需要这个元素了,数组中的引用仍然可以让它继续存在。这种情况(保存一个不需要的对象的引用)称为游离。
在这里,避免对象游离很容易,只需将被弹出的数组元素的值设为null即可,这将覆盖无用的引用并使系统可以在用例使用完被弹出的元素后回收它的内存。
6. 因为(某些历史原因)Iterator不在java.lang中(尽管Iterable是java.lang的一部分)。
时间: 2024-10-24 21:48:51