在Java里如何实现控制台购物车功能_Java集合操作实战说明
发布时间 - 2026-01-29 00:00:00 点击率:次应使用ArrayList而非Array实现购物车,因其自动扩容、支持动态增删改查;需注意去重逻辑、ID定位删除、封装quantity更新方法、输入异常处理、索引越界检查、价格精度控制(推荐int分单位或BigDecimal)、清空后状态重置及购物车封装。
用 ArrayList 存商品,别用 Array
控制台购物车本质是动态增删改查,Array 长度固定,每次加商品都要手动扩容、复制,容易出错且难维护。直接用 ArrayList 更稳妥——它底层自动处理扩容,支持 add()、remove(int)、get(int) 等常用操作。
注意:如果商品需去重(比如同名同价只算一件),ArrayList 本身不保证唯一性,得靠业务逻辑判断,或改用 LinkedHashSet(保持插入顺序+去重)。
-
Product类至少要有id、name、price、quantity字段 - 避免用
String拼接商品信息做 key,易因空格/大小写误判重复 - 删除时别只靠
name,优先用唯一id定位,防止同名商品删错
修改数量要用 set() 或封装更新方法,别直接改字段
用户输入“将商品 2 的数量改为 5”,如果直接拿到 ArrayList 里的 Product 对象,然后写 product.quantity = 5,看似快,但后续统计总价、打印列表时容易因对象状态不一致出 bug(比如没同步更新小计字段)。
更可靠的做法是:为 Product 提供 updateQuantity(int newQty) 方法,在内部校验合法性(如 newQty 则抛异常或设为 0),并可顺带重算 subtotal。
- 控制台输入解析后,务必先用
try-catch包住Integer.parseInt(),防止用户输 “abc” 导致程序崩溃退出 - 修改前建议用
list.get(index)先检查索引是否越界,IndexOutOfBoundsException是常见运行时错误 - 若支持“增加 3 件”而非“设为 3 件”,记得用
+=而非=
计算总价时小心浮点数精度,用 BigDecimal 或转为分单位整数
直接用 double price = 19.99 累加多次后可能出现 59.989999999999995 这种结果,控制台显示很诡异。Java 中金融类计算必须规避 float/double。
两种实用方案:
– 方案一:价格统一存为 int(单位:分),显示时除以 100.0 并格式化;
– 方案二:用 BigDecimal,构造时用字符串(new BigDecimal("19.99")),别用 double 构造器。
-
BigDecimal的add()、multiply()返回新对象,不是原地修改,别漏了赋值 - 打印总价时用
setScale(2, RoundingMode.HALF_UP)保证两位小数 - 如果只是教学演示且不涉及真实金额,可用
String.format("%.2f", total)应急,但别在实际项目里这么干
清空购物车后要重置状态,别只清 ArrayList
调用 cartList.clear() 确实能删掉所有商品,但容易忽略关联状态:比如你有个 totalAmount 变量缓存了当前总价,清空后没重置,下

nextId 计数器用于生成新商品 ID,清空后没归零,会导致 ID 不连续。
推荐做法是把购物车封装成独立类(如 ShoppingCart),提供 clear() 方法,在里面统一重置所有内部字段。
- 不要在主循环里反复
new ArrayList()替代清空——对象创建有开销,且可能让引用失效 - 如果支持“恢复上次清空”,就得额外实现撤销栈(
Deque),这已超出基础控制台需求,先放一放- >
- 清空后建议输出提示语,比如 “✅ 购物车已清空”,否则用户不确定操作是否生效
ArrayList 引用时,一个地方改乱了,其他地方读出来就是错的。
# java
# 栈
# 金融
# String
# Integer
# Float
# Array
# 封装
# format
# try
# catch
# 字符串
# int
# double
# 循环
# 对象
# bug
# 购物车
# 清空
# 而非
# 设为
# 小计
# 时用
# 看着
# 有个
# 尤其是
# 都要
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何在七牛云存储上搭建网站并设置自定义域名?
Laravel的辅助函数有哪些_Laravel常用Helpers函数提高开发效率
详解jQuery中的事件
Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解
Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制
Laravel如何实现API版本控制_Laravel API版本化路由设计策略
深入理解Android中的xmlns:tools属性
Bootstrap整体框架之CSS12栅格系统
SQL查询语句优化的实用方法总结
Laravel路由怎么定义_Laravel核心路由系统完全入门指南
Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程
Laravel如何编写单元测试和功能测试?(PHPUnit示例)
无锡营销型网站制作公司,无锡网选车牌流程?
Android自定义控件实现温度旋转按钮效果
历史网站制作软件,华为如何找回被删除的网站?
Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能
如何在Tomcat中配置并部署网站项目?
夸克浏览器网页跳转延迟怎么办 夸克浏览器跳转优化
Laravel如何使用withoutEvents方法临时禁用模型事件
大型企业网站制作流程,做网站需要注册公司吗?
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】
js实现获取鼠标当前的位置
详解Android——蓝牙技术 带你实现终端间数据传输
如何在阿里云高效完成企业建站全流程?
如何快速搭建自助建站会员专属系统?
免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?
Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧
网站制作大概要多少钱一个,做一个平台网站大概多少钱?
Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转
Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】
常州企业网站制作公司,全国继续教育网怎么登录?
如何挑选最适合建站的高性能VPS主机?
Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性
Laravel Session怎么存储_Laravel Session驱动配置详解
Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全
海南网站制作公司有哪些,海口网是哪家的?
标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南
黑客入侵网站服务器的常见手法有哪些?
如何快速生成可下载的建站源码工具?
LinuxCD持续部署教程_自动发布与回滚机制
js实现点击每个li节点,都弹出其文本值及修改
Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询
如何用VPS主机快速搭建个人网站?
Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区
手机网站制作与建设方案,手机网站如何建设?
企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?
Laravel如何处理CORS跨域请求?(配置示例)
如何用PHP工具快速搭建高效网站?
使用PHP下载CSS文件中的所有图片【几行代码即可实现】

