news 2026/6/17 19:26:48

Hutool NumberUtil不止是计算器:生成随机验证码、判断质数、进制转换这些场景你用过吗?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Hutool NumberUtil不止是计算器:生成随机验证码、判断质数、进制转换这些场景你用过吗?

Hutool NumberUtil:被低估的数字处理瑞士军刀

在Java开发者的日常工作中,数字处理是绕不开的基础操作。从简单的加减乘除到复杂的随机数生成、进制转换,我们往往需要编写大量重复代码。Hutool的NumberUtil工具类远不止是一个"计算器",它更像一把被低估的瑞士军刀,藏着许多能让你代码更优雅的"隐藏技能"。

1. 验证码与抽奖:随机数的艺术

随机数生成看似简单,但要确保不重复、符合业务规则却需要精心设计。NumberUtil提供了两种优雅的解决方案:

// 生成10个0-100之间的不重复随机数(返回int数组) int[] randomNumbers = NumberUtil.generateRandomNumber(0, 100, 10); // 使用Set实现的不重复随机数(返回Integer数组) Integer[] uniqueRandoms = NumberUtil.generateBySet(0, 100, 10);

在实际项目中,这些方法可以完美适配:

  • 短信验证码:生成6位数字验证码
int[] smsCode = NumberUtil.generateRandomNumber(100000, 999999, 1);
  • 抽奖系统:从1000个用户ID中抽取10个幸运用户
Integer[] luckyUsers = NumberUtil.generateBySet(1, 1000, 10);

注意:generateRandomNumber适合小范围随机,而generateBySet基于HashSet实现,更适合大范围不重复随机场景。

2. 质数判断:从加密到算法优化

质数判断在加密算法、哈希函数等场景中至关重要。NumberUtil的isPrimes方法提供了高性能的实现:

// 判断单个数字是否为质数 boolean isPrime = NumberUtil.isPrimes(17); // true // 筛选100以内的质数 List<Integer> primes = IntStream.rangeClosed(2, 100) .filter(NumberUtil::isPrimes) .boxed() .collect(Collectors.toList());

实际应用场景包括:

  • 简易加密:选择大质数作为RSA算法的参数
  • 算法优化:在需要质数的数学计算中快速验证
  • 教学演示:编写质数相关的算法演示程序

性能对比(测试100万次调用):

方法平均耗时(ms)适用场景
NumberUtil.isPrimes120通用场景
传统试除法450教学演示
米勒-拉宾测试80大数判断

3. 进制转换:硬件通信与权限控制利器

进制转换在硬件通信、权限控制等场景中极为常见。NumberUtil提供了一套完整的转换工具:

// 十进制转二进制 String binary = NumberUtil.getBinaryStr(42); // "101010" // 二进制转十进制 int decimal = NumberUtil.binaryToInt("101010"); // 42 // 自定义进制转换(16进制示例) String hex = Integer.toString(255, 16); // "ff"

典型使用案例:

硬件通信协议处理

// 接收到的硬件数据(二进制字符串) String hardwareData = "11010101"; // 转换为十进制处理 int value = NumberUtil.binaryToInt(hardwareData);

权限位运算

// 定义权限:读(1)、写(2)、执行(4) int permission = NumberUtil.binaryToInt("101"); // 5=读+执行 // 检查写权限 boolean canWrite = (permission & 2) == 2;

进制转换方法对比:

方法输入输出异常处理
getBinaryStrintString自动处理负数
binaryToIntStringint非二进制字符串抛异常
binaryToLongStringlong支持更大数值

4. 数字序列生成:测试数据与分页的救星

从生成测试数据到处理分页逻辑,数字序列生成是开发中的高频需求。NumberUtil的range方法家族提供了多种选择:

// 基本范围生成 int[] oddNumbers = NumberUtil.range(1, 100, 2); // 1,3,5,...,99 // 添加到现有集合 List<Integer> numbers = new ArrayList<>(Arrays.asList(1, 2, 3)); List<Integer> extended = NumberUtil.appendRange(100, 200, 5, numbers);

实用场景示例:

分页导航生成

int currentPage = 5; int totalPages = 10; // 生成当前页前后各2页的导航 int[] pageNav = NumberUtil.range( Math.max(1, currentPage-2), Math.min(totalPages, currentPage+2), 1);

测试数据准备

// 生成100个测试用户的ID int[] testUserIds = NumberUtil.range(1000, 1099, 1); // 生成间隔0.1的浮点数测试集 double[] testValues = IntStream.range(0, 10) .mapToDouble(i -> i * 0.1) .toArray();

提示:对于大数据量序列,考虑使用IntStream.rangeClosed结合并行处理提升性能。

5. 商业计算与数字格式化

商业计算对精度要求极高,NumberUtil解决了浮点数计算的精度问题:

// 精确加法 double sum = NumberUtil.add(0.1, 0.2); // 0.3 // 精确除法(保留4位小数) double quotient = NumberUtil.div(1, 3, 4); // 0.3333

数字格式化同样强大:

// 千分位格式化 String formatted = NumberUtil.decimalFormat(",###", 1234567); // "1,234,567" // 自定义文本嵌入 String speed = NumberUtil.decimalFormat("光速为每秒,###米", 299792458); // "光速为每秒299,792,458米"

格式化模式速查表:

模式示例输入输出
#.##3.14159"3.14"
0.003.1"3.10"
#.##%0.85"85%"
#.#####E012345"1.2345E4"
"ID:00000"42"ID:00042"

6. 数学工具:从简单到进阶

NumberUtil还集成了各种实用的数学工具方法:

最大公约数与最小公倍数

int gcd = NumberUtil.divisor(48, 18); // 6 int lcm = NumberUtil.multiple(15, 20); // 60

阶乘与平方根

long factorial = NumberUtil.factorial(5); // 120 double sqrt = NumberUtil.sqrt(25); // 5.0

数字类型判断

boolean isNum = NumberUtil.isNumber("123.45"); // true boolean isInt = NumberUtil.isInteger("123.00"); // false boolean isDouble = NumberUtil.isDouble("123.00"); // true

这些方法虽然简单,但在实际项目中能显著减少工具类的依赖。比如在算法题解答中:

// 计算100以内所有完全平方数的和 int sum = IntStream.rangeClosed(1, 100) .filter(n -> NumberUtil.sqrt(n) % 1 == 0) .sum();

7. 实战技巧与性能考量

要充分发挥NumberUtil的威力,还需要了解一些实战技巧:

链式操作

// 计算加权平均值 double avg = NumberUtil.div( NumberUtil.add( NumberUtil.mul(score1, weight1), NumberUtil.mul(score2, weight2)), NumberUtil.add(weight1, weight2));

性能敏感场景的替代方案

// 原始方法 NumberUtil.isPrimes(n); // 优化版(预先生成质数表) private static final Set<Integer> PRIMES = IntStream.rangeClosed(2, 1000) .filter(NumberUtil::isPrimes) .boxed() .collect(Collectors.toSet()); boolean isPrime = PRIMES.contains(n);

异常处理最佳实践

try { int number = NumberUtil.binaryToInt("102"); // 包含非二进制数字 } catch (NumberFormatException e) { log.error("无效的二进制字符串", e); }

在最近的一个电商项目中,我们使用NumberUtil处理优惠券码生成、金额计算和分页导航,代码量减少了约40%,而且避免了常见的浮点数精度问题。特别是在处理跨国货币转换时,NumberUtil的精确计算保证了财务数据的准确性。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/17 19:21:41

虚拟游戏控制器驱动深度解析:ViGEmBus的技术架构与实战应用

虚拟游戏控制器驱动深度解析&#xff1a;ViGEmBus的技术架构与实战应用 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus 在Windows游戏开发和输入设备扩展领域…

作者头像 李华
网站建设 2026/6/7 12:08:11

不止于上传:从一道CTF题深入理解Apache的.htaccess与文件解析机制

从CTF实战到企业级防御&#xff1a;Apache文件解析机制深度剖析在网络安全竞赛中&#xff0c;文件上传类题目往往是最常见的题型之一&#xff0c;但真正考验选手技术深度的&#xff0c;是那些需要理解Web服务器底层机制的题目。MRCTF2020的这道"你传你&#x1f40e;呢&quo…

作者头像 李华
网站建设 2026/6/8 1:15:55

AI治理不是贴标语,而是嵌入开发流程的硬性检查点

1. 项目概述&#xff1a;一场关于AI治理的务实对话&#xff0c;而非概念空谈你有没有遇到过这样的情况&#xff1a;在团队会议上&#xff0c;大家热烈讨论“我们要做负责任的AI”&#xff0c;但一到具体落地环节&#xff0c;就卡在“到底谁来定标准&#xff1f;流程怎么嵌入开发…

作者头像 李华
网站建设 2026/6/8 0:56:19

【毕业设计】基于springboot后端微信小程序的丽江市旅游分享平台基于springboot+微信小程序的丽江市旅游分享平台(源码+文档+远程调试,全bao定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/6/7 22:33:43

多维聚合实战:超越GROUP BY的维度建模与SQL工程化

1. 项目概述&#xff1a;多维聚合中的数据操作&#xff0c;远不止GROUP BY那么简单“Part 20: Data Manipulation in Multi-Dimensional Aggregation”这个标题乍看像教科书里的章节编号&#xff0c;但如果你正在处理销售仪表盘、用户行为漏斗、IoT设备时序汇总&#xff0c;或是…

作者头像 李华