当前位置: 首页 > news >正文

Java核心类库深度解析与实战:从字符串处理到计算器开发

一、字符串处理三剑客详解

1.1 String类的特性与陷阱

// 字符串常量池特性演示
String s1 = "hello";
String s2 = new String("hello");
System.out.println(s1 == s2); // false
System.out.println(s1.equals(s2)); // true// 不可变性带来的问题
String str = "a";
for(int i=0; i<10000; i++) {str += "b"; // 每次生成新对象
}

1.2 StringBuilder与StringBuffer

// 性能对比测试
public class StringPerformanceTest {public static void main(String[] args) {long startTime = System.currentTimeMillis();concatWithStringBuilder();System.out.println("StringBuilder耗时:" + (System.currentTimeMillis() - startTime));startTime = System.currentTimeMillis();concatWithStringBuffer();System.out.println("StringBuffer耗时:" + (System.currentTimeMillis() - startTime));}private static void concatWithStringBuilder() {StringBuilder sb = new StringBuilder();for(int i=0; i<100000; i++) {sb.append("test");}}private static void concatWithStringBuffer() {StringBuffer sb = new StringBuffer();for(int i=0; i<100000; i++) {sb.append("test");}}
}

1.3 选择策略

场景推荐类原因
单线程字符串拼接StringBuilder非线程安全但性能最优
多线程环境StringBuffer线程安全
少量字符串操作String利用常量池优化

二、新一代日期时间API(Java 8+)

2.1 LocalDateTime核心用法

// 创建日期时间对象
LocalDateTime now = LocalDateTime.now();
LocalDateTime specificDate = LocalDateTime.of(2025, 7, 15, 10, 30);// 格式化输出
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
System.out.println(now.format(formatter)); // 2025-07-15 14:30:45// 时间计算
LocalDateTime tomorrow = now.plusDays(1);
LocalDateTime twoHoursLater = now.plusHours(2);// 时间比较
boolean isAfter = now.isAfter(specificDate);

2.2 常见问题处理

// 时区处理
ZonedDateTime zdt = ZonedDateTime.now(ZoneId.of("Asia/Shanghai"));// 时间间隔计算
Duration duration = Duration.between(now, tomorrow);
System.out.println("间隔秒数:" + duration.getSeconds());// 自定义格式化器
DateTimeFormatter customFormatter = new DateTimeFormatterBuilder().appendPattern("yyyy/MM/dd").parseDefaulting(ChronoField.HOUR_OF_DAY, 0).toFormatter();

三、实战项目:简易计算器开发

3.1 需求分析

  • 支持加减乘除四则运算
  • 支持连续运算(如:3+5*6-2)
  • 错误处理(除零错误、非法输入)
  • 显示运算历史记录

3.2 核心代码实现

import java.util.Scanner;
import java.util.Stack;public class SimpleCalculator {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);Stack<Double> numbers = new Stack<>();Stack<Character> operators = new Stack<>();System.out.println("简易计算器(输入'exit'退出)");while (true) {System.out.print("请输入表达式:");String input = scanner.nextLine().replaceAll(" ", "");if ("exit".equalsIgnoreCase(input)) {break;}try {double result = calculate(input);System.out.println("结果:" + result);// 记录历史(使用LocalDateTime)String history = LocalDateTime.now().format(DateTimeFormatter.ofPattern("HH:mm:ss")) + " | " + input + " = " + result;System.out.println(history);} catch (Exception e) {System.out.println("错误:" + e.getMessage());}}}private static double calculate(String expr) {// 简单实现(仅支持单运算符)String[] parts = expr.split("[+\\-*/]");if (parts.length != 2) {throw new RuntimeException("表达式格式错误");}double num1 = Double.parseDouble(parts[0]);double num2 = Double.parseDouble(parts[1]);char op = expr.replaceAll("[^+\\-*/]", "").charAt(0);switch (op) {case '+': return num1 + num2;case '-': return num1 - num2;case '*': return num1 * num2;case '/': if (num2 == 0) throw new RuntimeException("除数不能为零");return num1 / num2;default: throw new RuntimeException("不支持的运算符");}}
}

3.3 扩展功能建议

  1. 支持复杂表达式(使用栈实现运算优先级)
// 改进版表达式解析
private static double evaluateExpression(String expr) {Stack<Double> values = new Stack<>();Stack<Character> ops = new Stack<>();int i = 0;while (i < expr.length()) {if (expr.charAt(i) == ' ') {i++;continue;}if (Character.isDigit(expr.charAt(i))) {StringBuilder sb = new StringBuilder();while (i < expr.length() && (Character.isDigit(expr.charAt(i)) || expr.charAt(i) == '.')) {sb.append(expr.charAt(i++));}values.push(Double.parseDouble(sb.toString()));continue;}while (!ops.isEmpty() && getPrecedence(ops.peek()) >= getPrecedence(expr.charAt(i))) {values.push(applyOp(ops.pop(), values.pop(), values.pop()));}ops.push(expr.charAt(i));i++;}while (!ops.isEmpty()) {values.push(applyOp(ops.pop(), values.pop(), values.pop()));}return values.pop();
}

四、性能优化技巧

4.1 字符串处理优化

// 预编译正则表达式
private static final Pattern SPLIT_PATTERN = Pattern.compile("[+\\-*/]");// 复用StringBuilder
public class StringReuser {private StringBuilder sb = new StringBuilder(1024);public String process(String input) {sb.setLength(0); // 清空而非新建对象return sb.append(input).append("_processed").toString();}
}

4.2 日期处理最佳实践

// 使用TemporalAdjusters进行日期调整
LocalDate date = LocalDate.now();
LocalDate lastDayOfMonth = date.with(TemporalAdjusters.lastDayOfMonth());// 自定义日期格式缓存
public class DateFormatterCache {private static final Map<String, DateTimeFormatter> CACHE = new ConcurrentHashMap<>();public static DateTimeFormatter getFormatter(String pattern) {return CACHE.computeIfAbsent(pattern, p -> DateTimeFormatter.ofPattern(p));}
}

五、总结

通过本文的学习,读者应该掌握:

  1. 字符串处理类库的选择策略和性能优化技巧
  2. Java 8日期时间API的现代化用法
  3. 实际项目开发中类库的综合应用
  4. 计算器开发中的核心算法实现

建议在实际开发中:

  • 字符串拼接超过3次时优先使用StringBuilder
  • 日期处理统一使用java.time包替代旧类
  • 复杂表达式解析考虑使用ANTLR等解析器生成工具
  • 关键操作添加异常处理和日志记录

文章转载自:
http://anthobian.zekgq.cn
http://actinon.zekgq.cn
http://basidium.zekgq.cn
http://allege.zekgq.cn
http://acetifier.zekgq.cn
http://atmospherically.zekgq.cn
http://barrett.zekgq.cn
http://chinchona.zekgq.cn
http://brecknock.zekgq.cn
http://akita.zekgq.cn
http://benchman.zekgq.cn
http://azulejo.zekgq.cn
http://activated.zekgq.cn
http://abutilon.zekgq.cn
http://aurorean.zekgq.cn
http://acrodrome.zekgq.cn
http://antithetic.zekgq.cn
http://cardiosclerosis.zekgq.cn
http://adenoidectomy.zekgq.cn
http://bacchante.zekgq.cn
http://bunting.zekgq.cn
http://almond.zekgq.cn
http://andromonoecism.zekgq.cn
http://choice.zekgq.cn
http://bought.zekgq.cn
http://academicals.zekgq.cn
http://activation.zekgq.cn
http://afflictive.zekgq.cn
http://anomie.zekgq.cn
http://acaudate.zekgq.cn
http://www.dtcms.com/a/281316.html

相关文章:

  • 外网如何连接内网中的mysql数据库服务?跨网直接访问操作,不用公网IP
  • 人机协作系列(四)AI编程的下一个范式革命——看Factory AI如何重构软件工程?
  • 力扣——1071. 字符串的最大公因子
  • 解密AWS VPC路由表:显式关联与隐式关联,谁决定了网络出口?
  • 深入剖析Java并发基石:AQS原理与实战
  • java 并发面试题2
  • 【Java篇】IntelliJ IDEA 安装与基础配置指南
  • Linux操作系统从入门到实战(十)Linux开发工具(下)make/Makefile的推导过程与扩展语法
  • 大模型在1型糖尿病肾病V期预测及治疗方案制定中的应用研究
  • 快速了解 HTTPS
  • MyBatis Plus功能增强全解析:从手写SQL到优雅开发的进阶指南
  • 16、鸿蒙Harmony Next开发:组件扩展
  • KeilMDK5如何生成.bin文件
  • 项目进度跨地域团队协作困难,如何统一进度安排
  • PHP语法高级篇(三):Cookie与会话
  • Redis中的红锁
  • ADC采集、缓存
  • Axios 完整功能介绍和完整示例演示
  • 映美打印机-URL页面打印
  • Spring MVC 执行流程详解:一次请求经历了什么?
  • 微信小程序:在ios中border边框显示不全
  • XCTF-repeater三链破盾:PIE泄露+ROP桥接+Shellcode执行的艺术
  • PyTorch 数据加载实战:从 CSV 到图像的全流程解析
  • 股指期货主连和次主连的区别是什么?
  • 游戏加速器核心技术:动态超发
  • Linux 文件系统实现层详解:原理、结构与驱动衔接
  • 人类气道黏膜下腺类器官:解析呼吸炎症与感染的新平台
  • Sharding-JDBC 分布式事务实战指南:XA/Seata 方案解析(三)
  • (3)从零开发 Chrome 插件:网页图片的批量下载
  • Google EMM是什么?