Java常用类编程题刷题经验:String、日期与集合排序的避坑指南
很多人在学到Java面向对象这一章时最容易卡住的位置并不是继承、多态这些理论反而是常用类这一串编程题。名字听起来简单无非就是String、日期、包装类、集合操作但真到了OJ在线判题系统上写代码你会发现自己要么记不住方法名要么不知道判题系统到底想要什么格式的输出。这套题第11到20题我前后刷了两遍中间踩了不少坑也总结出了一些通用的解题思路分享出来供正在刷题或者准备Java考试的同学参考。这套题目最大的特点是它不考你背了多少API而是考你有没有真正理解这些类在真实场景里怎么配合使用。比如字符串处理一定会结合正则或字符数组日期时间一定会涉及格式化和字符串互转排序一定会要求你自定义比较规则。如果你只看书不敲代码很容易在第一道题就被卡住。1. 常用类编程题到底在考什么1.1 从题目清单看核心考点分布先大致看一下这套题第11-20题的考点分布。从网上大家晒出的题目描述和讨论来看第11到15题基本集中在字符串处理、StringBuilder拼接、字符与字符串互转这是最基础的送分题但也是最容易因为细节丢分的题。第16到18题开始引入日期时间类Old API和New API都有涉及考试系统往往要求你按特定格式输出日期这就需要你熟练掌握格式化符号并把字符串解析成日期对象。第19、20题则偏向包装类、自动拆装箱、Math/随机数以及简单的排序和比较器综合性明显增强。也就是说这套题覆盖了Java常用类中最核心的几个家族字符串族String、StringBuilder、StringBuffer、日期族Date、Calendar、LocalDate等、数值族包装类、Math、Random、以及数组工具Arrays、Collections。把这几个家族的知识点串起来你会发现这一套题刷完之后Java毕业设计或期末考试里最常用的API你已经掌握了一大半。1.2 为什么反复考这些类而不考别的有些同学会觉得奇怪Java里类那么多为什么判断题偏偏选中这些常用类原因很简单它们是日常业务开发中出现频率最高的基础组件。你随便打开一个真实项目的源码String、Integer、Date、ArrayList这些类出现的频率远远高于你自定义的业务类。判题系统选它们作为考题本质上是希望你养成用现成工具类解决问题的习惯而不是什么都自己造轮子。另一个原因是这些类有非常明确的边界感。比如String是不可变的StringBuilder是可变的SimpleDateFormat是线程不安全的DateTimeFormatter是线程安全的。这些特性在考题中很容易通过具体的用例来验证比考抽象的理论概念更加直观。所以刷这套题的过程其实也是在训练你的工程思维——知道什么时候选哪个类、用哪个方法比背下所有方法名重要得多。2. 字符串与文本处理类题目的核心细节2.1 String类的使用要点不可变性带来的连锁反应字符串在几乎所有题目中都会出现所以先把String这个基础中的基础的裁清楚String对象一旦创建就不可改变每次修改都会产生新对象。第11题和第12题一般会让你统计某个字符的出现次数、判断字符串是否对称、或者做简单的单词替换这些题的常规思路就是先toCharArray()把字符串拆成字符数组然后逐个遍历判断。写代码之前建议先把String的常用方法过一遍length()、charAt()、indexOf()、substring()、toCharArray()、split()、replace()、equals()、equalsIgnoreCase()。其中坑最多的是substring的索引规则——它接收的是起始索引含和结束索引不含很多人用错边界导致下标越界或取错字符判题系统直接给你一个红色Runtime Error。还有一个细节特别容易忽略equals与的区别。在OJ里如果两个字符串内容相同但来自不同的创建方式用比较很可能会得到false因为一个是字面量、一个是new出来的对象。这是所有Java初学者绕不过去的坎第11题这种送分题如果没注意到照样会白白丢掉分数。2.2 StringBuilder/StringBuffer的高频题型第13题到15题大概率会涉及字符串拼接性能优化典型场景是循环里反复拼接字符串要求最终输出某个变形后的结果。如果你直接写str c在字符串长度不大时没问题但如果循环次数上万每次拼接都会创建新字符串对象性能会明显下降判题系统对执行时间卡得比较严的时候就会出现超时。正确做法是用StringBuilder。这个类用append()方法拼接内容底层是可变字符数组拼接一万次也不会产生一万个中间对象。StringBuffer和StringBuilder的API基本一致区别在于StringBuffer的方法加了同步锁单线程场景下性能稍差OJ或普通业务代码里用StringBuilder就够了。这里有一个我自己常用的套路。比如题目要求把字符串中的每个字符按规则变形后拼接我会这样写StringBuilder sb new StringBuilder(); for (char c : str.toCharArray()) { sb.append(transform(c)); } String result sb.toString();注意最后一定要用toString()转回String否则很多方法不认。如果你忘了转换直接拿StringBuilder去和字符串比较编译都过不了。2.3 字符串类题目的典型坑空串与空格字符串处理题还有一个隐藏考点空串和空格的区别。题目里如果允许输入包含空串你的代码先要判断str null || str.isEmpty()否则在调用str.length()时直接抛NullPointerException。而如果输入是一行可能包含空格的文本用Scanner的next()读进来只会读取空格前的部分要用nextLine()读整行。区分这两个输入方式非常关键。我见过不少同学在题目要求读取含空格的句子时用了next()然后发现怎么调试都只拿到前半截输出的结果永远比预期少。记住一个原则只要题目描述里说一行字符串或一句话就优先用nextLine()如果明确说一个单词或一个数字才用next()或nextInt()。3. 日期时间与包装类题目的实操拆解3.1 旧API三件套Date、SimpleDateFormat、Calendar日期时间类的题目最经典的就是给你一个日期字符串让你计算它是星期几、加若干天后的日期、或者格式化输出为指定格式。这些题有两种写法一种是传统的Date SimpleDateFormat Calendar在Java 8之前只能这么写另一种是用Java 8之后的新日期时间API。先说说旧API。SimpleDateFormat的格式符号必须要记清yyyy是四位年份MM是两位月份dd是两位日期HH是24小时制的小时hh是12小时制mm是分钟ss是秒。比如new SimpleDateFormat(yyyy-MM-dd HH:mm:ss)这就是最常用的格式。解析的时候调用parse()格式化显调用format()。Calendar的使用很多人搞不清楚月份为什么从0开始。Calendar.JANUARY 0Calendar.DECEMBER 11。如果你要设置某年某月比如2025年3月要写成calendar.set(2025, 2, 15)月份减1。这是老API最反人类的设计之一每年都有一批考生栽在这上面。更难受的是Calendar.get(Calendar.DAY_OF_WEEK)返回的周日是1、周一是2并不是我们习惯的周一为1。所以第16题如果要输出中文星期几你很可能要写一个数组和一个switch来判断。3.2 新APILocalDate与DateTimeFormatter的正确打开方式如果你在写这套题时用的是Java 8以上环境强烈建议直接用java.time包代码会清爽很多。LocalDate.now()获得当前日期LocalDate.parse(2024-05-20)可以直接按ISO格式解析字符串plusDays(1)就是加一天getDayOfWeek()返回星期枚举getDayOfWeek().getValue()周一到周日对应1到7不会出现旧API那种0和1的混乱。DateTimeFormatter和SimpleDateFormat用法类似但它是线程安全的定义格式的符号基本一致基本可以无缝过渡。一个典型的写法DateTimeFormatter formatter DateTimeFormatter.ofPattern(yyyy年MM月dd日); LocalDate date LocalDate.parse(2024-05-20, formatter); String result date.plusDays(10).format(formatter);我个人的建议是如果题目没有强制要求用旧API就优先选择新API。不是因为新API更高级而是因为它的语义更清晰、坑更少调试时间能省下一大截。就算你考试时环境是Java 8LocalDate这些类也完全能用不用犹豫。3.3 包装类与自动装箱拆箱的隐形陷阱第18到19题经常会安排一些让你判断输出结果的题或者让你用包装类做数值转换。Integer、Double、Character这些包装类本身不难难的是自动装箱和拆箱的边界。比如Integer a 127; Integer b 127;a b是true因为-128到127之间会走缓存但Integer a 128; Integer b 128;a b就变成了false。很多同学第一次遇到这种题都一脸懵。再比如字符串转数字Integer.parseInt(123)返回intInteger.valueOf(123)返回Integer功能差不多但返回值类型不同。如果你在写方法返回值的时候搞混了编译报错还算好的最怕的是代码编译通过但逻辑错误。包装类还有一个倾向在循环里频繁拆箱装箱比如Integer sum 0; for (int i 0; i 10000; i) { sum i; }这个操作看起来合法实际每次sum i都会经历拆箱、相加、再装箱性能损失很大只不过循环次数不多时根本感觉不到。4. 数组、集合与排序相关题目的实战经验4.1 Math与Random类在编程题里的定位第19到20题通常会要求生成随机数、求最大值、四舍五入等等。Math类就是干这个的Math.max(1, 2)、Math.min(3, 4)、Math.abs(-5)、Math.pow(2, 10)、Math.sqrt(9)这些都是送分操作。Math.random()返回[0.0, 1.0)的double想生成1到100的整数括起来就是(int)(Math.random() * 100) 1。如果你用Random类写法会稳定一些Random random new Random(); int value random.nextInt(100) 1; // 1到100这里注意nextInt(100)生成的是0到99所以1才能变成1到100。题目如果要求生成n个不重复的随机数你千万不要自己写复杂的去重逻辑用HashSet或者Set存一下就好否则逻辑一复杂边界就容易出问题。另外Random类如果每次循环都new生成的序列可能不够随机最好在循环外只创建一个Random对象。4.2 Collections与Comparator的排序实现排序题在第19、20题几乎必出现考的就是你有没有掌握Comparator接口。最简单的排序对一个int数组直接用Arrays.sort(arr)就够了。但如果题目要求的是对一个字符串列表按长度排序或对自定义对象按年龄排序你就需要写一个Comparator。一个经典的写法是ListString list new ArrayList(Arrays.asList(banana, apple, pear)); list.sort(Comparator.comparingInt(String::length));如果题目要求先按长度排再按字典序排可以用thenComparinglist.sort(Comparator.comparingInt(String::length).thenComparing(Comparator.naturalOrder()));这个链式写法和JUnit的断言风格很像熟悉之后写起来非常快。但判题系统不是每次都能接受Lambda表达式如果环境比较老还是要掌握匿名内部类的写法Collections.sort(list, new ComparatorString() { Override public int compare(String o1, String o2) { if (o1.length() ! o2.length()) { return o1.length() - o2.length(); } return o1.compareTo(o2); } });4.3 数组排序时千万不要忽略的排序稳定性问题刷题过程中我注意到好多题要求相同大小保持输入顺序这就是稳定排序。Collections.sort和Arrays.sort对对象使用的是稳定的归并排序变体对基本类型使用的是双轴快速排序不稳定。如果你用int数组排完序还要输出原来的下标直接排序基本类型会丢失索引信息更稳妥的方案是创建下标数组按值的大小对下标数组排序。这道题的解题思路其实很朴素先理解什么是判题系统它是把你的程序跑起来用预设的输入去对比你的输出所以输入输出格式比什么都重要。如果你代码逻辑全对但输出多了一个空格、少了一个换行系统一样给你判错。建议输出之前把所有东西拼接成一个字符串或者用System.out.print一个个输出控制好换行位置比一次性println一大串要更容易排查问题。5. 常见问题与排查技巧实录5.1 编译通过但结果错误三个最容易忽略的原因第一个原因是输入读取不完整。如果题目先给一个整数n再给n行字符串你读完n之后一定要别忘记调用一次nextLine()把换行符吃掉否则第一行字符串会读成空串。第二个原因是格式化问题比如要求输出月份时补零就是05月而不是5月你要用%02d或者DateTimeFormatter的MM符号去处理不能直接拼数字。第三个原因是大小写问题equals和equalsIgnoreCase的区别在登录校验类模拟题里很常见不注意就会输出错误结果。我举一个这两天在群里看到的常见的例子。有同学写日期计算明明逻辑一点问题都没有但输出多了一个前导空格判题系统给出Presentation Error。这种错误最亏因为几乎不扣逻辑分但就是过不了。思路还是要回到问题排查上仔细看题目要求里的输出示例把示例的输出原样复制到你的测试用例中做对比。5.2 关于判题系统运行时间的建议这套常用类题目一般不会太卡时间但如果你的字符串拼接用不好还是可能慢到超时。我实测过在循环里做1万次字符串拼接用String直接加跟用StringBuilder相比时间差距能到几倍甚至十几倍。更直观的感受是String加越多越慢StringBuilder几乎线性。如果题目数据量给到10万级别用String就很容易超时。5.3 我的避免踩坑清单最后分享一个我自己整理的清单刷这类题之前我会快速过一遍字符串比较永远用equals不用读取多行输入时注意吃掉换行符日期格式符号大小写不能混MM是月mm是分SimpleDateFormat的parse可能抛出ParseException记得处理Calendar月份从0开始星期日的值是1包装类比较数值是否相等用equals或intValue别直接输出多个值时统一用空格或换行分隔别多打空格这套题刷完我从一个只会背API的半吊子变成了能直接看题写出规范代码的熟练工。尤其是日期时间那几道题踩过几次格式坑之后我现在看到日期格式化输出第一时间想的是我要用哪个格式符号、线程安全不安全、要不要转字符串而不是盲目试错。这些经验的积累就是编程手感的一部分很难靠看书获得必须亲手在OJ上跑一遍才能巩固。

相关新闻

Spring AI工具调用实战:失败恢复与调用上限的工程化设计

Spring AI工具调用实战:失败恢复与调用上限的工程化设计

1. 工具调用到底在解决什么问题很多人第一次接触 Spring AI 的工具调用(Tool Calling)时,脑子里浮现的画面大概是这样的:模型输出一段 JSON,框架反射一下,找到对应的方法,把参数塞进去执行&…

2026/10/12 6:38:51 阅读更多 →
Rational Rose 2017完整教程:从安装到双向工程实战

Rational Rose 2017完整教程:从安装到双向工程实战

1. 为什么2025年还要翻出Rational Rose 2017先聊点实际的。很多刚接触软件工程的人看到Rational Rose这个名字,第一反应是“这玩意儿不是早就淘汰了吗”。但你把招聘网站翻一遍就会发现,金融、制造、军工、电力这些行业的核心系统设计文档里,…

2026/10/12 6:38:51 阅读更多 →
大模型权重开源上线前自查清单:六项关键检查与实操指南

大模型权重开源上线前自查清单:六项关键检查与实操指南

1. 权重上线前为什么需要一份自查清单模型权重开源这件事,看起来只是把文件打包上传,实际上它更像是一次面向全世界的"交付"。你交出去的不只是几十上百GB的参数文件,还有一整套隐含的契约:别人下载之后能不能顺利加载、…

2026/10/12 6:37:51 阅读更多 →

最新新闻

国产AI算力地基:面向昇腾/寒武纪的调度与内存中间件

国产AI算力地基:面向昇腾/寒武纪的调度与内存中间件

1. 标题里藏着的“地基”到底指什么——先破除一个普遍误解很多人看到标题里“致敬DeepSeek”“国产算力的地基”这几个词,第一反应是:哦,又开源了一个大模型?是不是比Qwen更强?参数量多少?跑分如何&#x…

2026/10/12 7:17:13 阅读更多 →
具身智能创新原理(196):机器人复杂家居操作通用能力底座构建研究

具身智能创新原理(196):机器人复杂家居操作通用能力底座构建研究

前沿技术探索:TVA智能体(简称TVA)TVA智能体(亦称“AI智能体视觉”)是依托Transformer架构与“因式智能体”理论构建的新型工业视觉系统,也是当前最具代表性的具身视觉技术之一。它有机融合深度强化学习&…

2026/10/12 7:17:13 阅读更多 →
DeepSeek Harness:面向生产环境的可观察、可回放Agent工程框架

DeepSeek Harness:面向生产环境的可观察、可回放Agent工程框架

1. 项目概述:当Agent不再是个黑箱,而是一台可拆卸、可复盘的精密仪器最近在几个技术社区里频繁看到“DeepSeek Harness”这个词,它不像那些主打炫酷UI或营销话术的Agent框架,而是被某高校实验室的几位工程师反复提起——不是因为“…

2026/10/12 7:17:13 阅读更多 →
mem0:为AI Agent构建可编程、可审计的外挂记忆系统

mem0:为AI Agent构建可编程、可审计的外挂记忆系统

1. 项目概述:为什么一个“外挂记忆”正在改变AI Agent的实战能力边界最近在几个技术社区里,频繁看到开发者讨论“mem0”这个词,不是某个新出的模型,也不是某家大厂的闭源服务,而是一个开源的、专为AI Agent设计的记忆管…

2026/10/12 7:17:13 阅读更多 →
赛600烧机油真实原因与免拆排查流程,避免花冤枉钱

赛600烧机油真实原因与免拆排查流程,避免花冤枉钱

1. 先分清是“真烧”还是“正常消耗”:赛600机油位判断的常见误区先说一个我前段时间遇到的案例。有个车友骑赛600,刚过一万公里,群里抱怨说车烧机油,每跑一千公里油尺就明显下降,身边人一口咬定是四缸机通病&#xff…

2026/10/12 7:17:13 阅读更多 →
Cursor Tab 标签智能代码补全:把 settings 改到 TaoToken 的配置与验证

Cursor Tab 标签智能代码补全:把 settings 改到 TaoToken 的配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 7:16:13 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →