《数据结构与抽象:Java语言描述(原书第4版)》一1.3 使用ADT包

简介:

本节书摘来华章计算机《数据结构与抽象:Java语言描述(原书第4版)》一书中的第1章 ,第1.3节,[美]弗兰克M.卡拉诺(Frank M. Carrano) 蒂莫西M.亨利(Timothy M. Henry) 著 罗得岛大学  新英格兰理工学院 辛运帏 饶一梅 译 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

1.3 使用ADT包

假定我们雇用一名程序员使用Java实现ADT包,给定到目前为止已有的接口和规格说明。如果假定这些规格说明已经足够清楚能让程序员完成相关的实现,那么我们可以在程序中使用这些ADT操作而不需要知道实现的细节。即,我们不需要知道程序员如何实现这个包,也能使用这个包。我们只需知道ADT包做什么就可以了。本节假定已经有了一个Java类Bag,它实现了程序清单1-1给出的Java接口BagInterface。简单的例子说明我们如何使用Bag。
在程序清单1-2的第13行,注意一旦我们选择了包中对象的数据类型(本例中是Item),这个数据类型就包含在接口名后面的尖括号中。还要注意类名后面的空尖括号。包中的所有项必须是这个数据类型或这个数据类型的子类型。编译程序强制我们遵守这条约定。如果是基本数据类型,则可以将对应的包装类的实例放入包中。例如,不是使用基本数据类型int的实例,而是使用包装类Integer的实例。

示例:在线购物。当在线购物时,你挑选的商品保存在购物车或购物袋内,直到你准备去结账为止。实现购物网站的程序可以使用类Bag来维护购物车。毕竟,你挑选的购买物品的次序是不重要的。程序清单1-2显示这样一个程序的简单示例。

程序清单1-2 在线购物中购物袋的维护程序
image
image

为使示例简单,我们创建Item对象的数组来表示购物者挑选的商品。类Item可在本书的在线资源中找到,它定义了用来描述商品及价格的数据域,还定义了这些域的访问方法及toString方法。
初始时,我们使用Bag的默认构造方法创建Item对象的空包。注意,shoppingCart的数据类型是BagInterface。这个声明要求shoppingCart仅能调用声明在BagInterface中的方法。另外,我们可以用实现BagInterface的其他类来替换Bag,而不需要修改程序中后续的语句。
注意将挑选的商品添加到包中的循环,及结账时一次删除它们中的一个的循环。

自测题7 在前面的例子中,在结账过程中执行while循环,直到包是空的时为止。可用什么样的for语句来替换这个while语句?只根据shoppingCart的存在与否来写,而不是数组items。
示例:扑满。你或许有一个扑满、存钱罐,或者其他某个容器来存放你剩下的硬币。扑满装硬币,但并不组织它们。而扑满中肯定有重复的硬币。扑满好像一个包,但更简单,因为它仅有3个操作:可以将一个硬币添加到扑满中、删除一个(摇晃扑满,所以没办法控制哪个硬币掉下来),或者看看扑满是否为空。

假定你有表示硬币的类Coin,我们可以创建程序清单1-3中给出的类PiggyBank。PiggyBank对象将硬币保存在包中,即,保存在实现了接口BagInterface的类的实例中。PiggyBank的add、remove和isEmpty方法分别调用包方法来得到各自的结果。类PiggyBank是适配器类的一个示例。关于适配器类详见附录D。
程序清单1-3 扑满的类
image
image

程序清单1-4提供了类PiggyBank的主要示例。程序将一些硬币添加到扑满中,然后再删除所有的硬币。因为程序没有记录添加到扑满中的硬币,所以没办法控制删除哪个硬币。虽然输出的内容表示从扑满中拿走硬币的次序与它们放入扑满中的次序相反,但这个次序依赖于包的实现。我们在下一章将考虑这些实现。
注意,除了main方法外,程序定义了另一个方法addCoin。因为main是静态的且调用addCoin,所以addCoin也必须是静态的。方法addCoin接收的参数是一个Coin对象和一个PiggyBank对象。然后该方法将硬币添加到扑满中。
程序清单1-4 类PiggyBank的示例
image
image

注:方法可以改变作为参数传给它的对象的状态

将两个参数传给方法addCoin:一个硬币和一个扑满。这两个参数都是main方法中已存在的对象的引用。方法addCoin保存参数中这些引用的副本,你应该记得,它们的行为像局部变量。虽然addCoin不能改变引用,但因为它们已存在于main方法中,所以它能改变所指对象的状态。具体来说,它能通过向扑满中添加硬币来修改扑满(即PiggyBank对象)。记住,这个扑满只局部于main,且在addCoin的外面。

注:一旦在下一章实现了包类,你就能实际运行前一个程序清单中给出的程序。你只需要将类名Bag替换为下一章中的示例使用的一个类名即可。

自测题8 考虑程序清单1-4中的程序。在创建类PiggyBank的实例myBank后,假定将几个未知硬币添加到myBank中。写代码,从扑满中删除硬币,直到或者删除一分钱硬币,或者扑满为空时为止。

相关文章
|
6月前
|
前端开发 Java
java实现队列数据结构代码详解
本文详细解析了Java中队列数据结构的实现,包括队列的基本概念、应用场景及代码实现。队列是一种遵循“先进先出”原则的线性结构,支持在队尾插入和队头删除操作。文章介绍了顺序队列与链式队列,并重点分析了循环队列的实现方式以解决溢出问题。通过具体代码示例(如`enqueue`入队和`dequeue`出队),展示了队列的操作逻辑,帮助读者深入理解其工作机制。
167 1
|
4月前
|
存储 安全 Java
Java 集合面试题从数据结构到 HashMap 源码剖析详解及长尾考点梳理
本文深入解析Java集合框架,涵盖基础概念、常见集合类型及HashMap的底层数据结构与源码实现。从Collection、Map到Iterator接口,逐一剖析其特性与应用场景。重点解读HashMap在JDK1.7与1.8中的数据结构演变,包括数组+链表+红黑树优化,以及put方法和扩容机制的实现细节。结合订单管理与用户权限管理等实际案例,展示集合框架的应用价值,助你全面掌握相关知识,轻松应对面试与开发需求。
198 3
|
12月前
|
存储 Java
Java中的HashMap和TreeMap,通过具体示例展示了它们在处理复杂数据结构问题时的应用。
【10月更文挑战第19天】本文详细介绍了Java中的HashMap和TreeMap,通过具体示例展示了它们在处理复杂数据结构问题时的应用。HashMap以其高效的插入、查找和删除操作著称,而TreeMap则擅长于保持元素的自然排序或自定义排序,两者各具优势,适用于不同的开发场景。
122 1
|
6月前
|
存储 Java 编译器
Java 中 .length 的使用方法:深入理解 Java 数据结构中的长度获取机制
本文深入解析了 Java 中 `.length` 的使用方法及其在不同数据结构中的应用。对于数组,通过 `.length` 属性获取元素数量;字符串则使用 `.length()` 方法计算字符数;集合类如 `ArrayList` 采用 `.size()` 方法统计元素个数。此外,基本数据类型和包装类不支持长度属性。掌握这些区别,有助于开发者避免常见错误,提升代码质量。
478 1
|
9月前
|
存储 安全 Go
Go语言中的map数据结构是如何实现的?
Go 语言中的 `map` 是基于哈希表实现的键值对数据结构,支持快速查找、插入和删除操作。其原理涉及哈希函数、桶(Bucket)、动态扩容和哈希冲突处理等关键机制,平均时间复杂度为 O(1)。为了确保线程安全,Go 提供了 `sync.Map` 类型,通过分段锁实现并发访问的安全性。示例代码展示了如何使用自定义结构体和切片模拟 `map` 功能,以及如何使用 `sync.Map` 进行线程安全的操作。
238 9
|
10月前
|
算法 Java API
如何使用Java开发获得淘宝商品描述API接口?
本文详细介绍如何使用Java开发调用淘宝商品描述API接口,涵盖从注册淘宝开放平台账号、阅读平台规则、创建应用并申请接口权限,到安装开发工具、配置开发环境、获取访问令牌,以及具体的Java代码实现和注意事项。通过遵循这些步骤,开发者可以高效地获取商品详情、描述及图片等信息,为项目和业务增添价值。
262 10
|
10月前
|
存储 缓存 安全
Java 集合江湖:底层数据结构的大揭秘!
小米是一位热爱技术分享的程序员,本文详细解析了Java面试中常见的List、Set、Map的区别。不仅介绍了它们的基本特性和实现类,还深入探讨了各自的使用场景和面试技巧,帮助读者更好地理解和应对相关问题。
146 5
|
11月前
|
存储 算法 安全
2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
数据结构与算法系列学习之串的定义和基本操作、串的储存结构、基本操作的实现、朴素模式匹配算法、KMP算法等代码举例及图解说明;【含常见的报错问题及其对应的解决方法】你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
|
11月前
|
缓存 算法 Java
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
173 6
|
11月前
|
存储 Java 索引
Java中的数据结构:ArrayList和LinkedList的比较
【10月更文挑战第28天】在Java编程世界中,数据结构是构建复杂程序的基石。本文将深入探讨两种常用的数据结构:ArrayList和LinkedList,通过直观的比喻和实例分析,揭示它们各自的优势与局限,帮助你在面对不同的编程挑战时做出明智的选择。

热门文章

最新文章