如何使用Java开发记账本小程序_Java条件判断与集合应用说明

胖婷同学_4839

胖婷同学_4839

2026-01-20

441人浏览

原创

Java记账本中用if判断收支类型更灵活,适合范围判断;switch在Java 14+支持字符串和yield,语法更简洁,但需注意null安全及版本兼容性。

如何使用java开发记账本小程序_java条件判断与集合应用说明

Java记账本里怎么用 if 和 switch 判断收支类型

记账本最基础的逻辑就是区分“收入”和“支出”,不能靠人工肉眼识别,得让程序自动判断。常见做法是给每条记录加一个 type 字段(比如 "INCOME" 或 "EXPENSE"),再用条件语句分流处理。

用 if 更灵活,适合带范围判断的场景(比如金额大于1000算“大额支出”);switch 在 Java 14+ 支持字符串和 yield,写起来更干净,但注意旧版本只支持 String、枚举和基本类型。

  • 别直接比较字符串用 ==,必须用 "INCOME".equals(record.getType())
  • 如果 type 字段可能为 null,先判空再 equals,否则抛 NullPointerException
  • 多个并列类型(如 "SALARY"、"BONUS"、"TRANSFER")都算收入,switch 的 case 可以合并写:
    case "SALARY", "BONUS", "TRANSFER" -> totalIncome += record.getAmount();

用 ArrayList 还是 LinkedHashMap 存账单数据

初学者常默认用 ArrayList,确实简单,增删查都快,但记账本有两类高频操作:按日期排序展示、按月份统计总额——这时候 ArrayList 就得反复 sort() 或遍历过滤,效率低还容易漏逻辑。

LinkedHashMap 本身不解决排序问题,但它能配合 TreeMap 按时间建索引,或者你用 LocalDate 作 key,把当天所有账单塞进 ArrayList 值里:

Map<localdate list>> dailyRecords = new TreeMap(Collections.reverseOrder());</localdate>

这样查某天账单是 O(1),按月汇总只要遍历 keySet 并过滤 getYear() 和 getMonth() 即可。代价是内存稍高,但对几百条账单完全无感。

SEO Autopilot Pro
SEO Autopilot Pro

全自动 SEO 内容新鲜度引擎,监控关键词研究报告目录,自动生成落地页和博客文章,执行 SEO a...

下载
  • 别用 HashMap 存日期 key——它不保证顺序,遍历时日期乱序,UI 上看着就懵
  • 如果要做“最近7天”查询,用 TreeMap.subMap(from, to) 比循环判断快得多
  • 删除某条记录时,记得同步从对应日期的 List 中 remove(),否则数据不一致

Java 8 Stream 处理账单集合时的三个坑

用 records.stream().filter(...).map(...).collect(...) 写统计逻辑很简洁,但实际跑起来可能出错或变慢。

  • filter 里别调用可能抛异常的方法(比如解析字符串日期),要包 try-catch 或提前校验,否则整个流中断
  • 避免在 map 里做 IO 操作(如读配置文件、查数据库),Stream 默认是单线程,阻塞会拖慢全部流程
  • 统计月支出总额时,别写 records.stream().filter(r -> r.getType().equals("EXPENSE")).mapToDouble(Record::getAmount).sum() —— 这样每次都要全量扫描;应该先按 type 分组缓存:
    Map<string double> summary = records.stream()
        .collect(Collectors.groupingBy(Record::getType, Collectors.summingDouble(Record::getAmount)));</string>

为什么不用 Vector 或 Stack 存账单

有些老教程推荐用 Vector,说“线程安全”,但记账本小程序基本是单用户本地运行,根本不需要同步开销;Vector 每个方法都加 synchronized,性能比 ArrayList 低 20%~30%。

Stack 更不合适——它是后进先出结构,而账单天然按时间先后排列,用 push/pop 反而得倒着插、倒着取,逻辑绕且易错。

  • 真需要线程安全集合,用 Collections.synchronizedList(new ArrayList()) 或 CopyOnWriteArrayList(仅适用于读多写少)
  • 如果未来要加“撤销上一笔”功能,别用 Stack,改用 Deque(比如 ArrayDeque),addLast() 和 removeLast() 语义更清晰
  • 所有集合变量声明用接口类型:List records,而不是 ArrayList,方便以后换实现

实际开发中,最常被忽略的是日期字段的不可变性——LocalDate 没问题,但若用了 Date 或自己写的可变 MyDate 类,被误修改会导致统计结果错乱,且极难排查。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.02

7599

3

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

2023.09.22

569

3

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

2024.03.01

1698

6

switch语句用法
switch语句用法

switch语句用法:1、Switch语句只能用于整数类型,枚举类型和String类型,不能用于浮点数类型和布尔类型;2、每个case语句后面必须跟着一个break语句,以防止执行其他case的代码块,没有break语句,将会继续执行下一个case的代码块;3、可以在一个case语句中匹配多个值,使用逗号分隔;4、Switch语句中的default代码块是可选的等等。

2023.09.21

1071

6

Java switch的用法
Java switch的用法

Java中的switch语句用于根据不同的条件执行不同的代码块。想了解更多switch的相关内容,可以阅读本专题下面的文章。

2024.03.13

1457

13

sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

2023.09.04

1158

7

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.03

1938

5

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.04

3204

5

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

2023.10.24

6404

49

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习