Java 里用 Comparable 给对象排序,记住 compareTo 返回值规则就行
实现 Comparable 接口并重写 compareTo,就能用 Arrays.sort 对自定义对象排序,顺便聊聊几个容易踩的坑。
支持通配符SSL证书、多域名证书、IP证书。适配ACME接口, 支持Zerossl、Let's Encrypt和Google等渠道。登录已有账号
2026-08-27 04:00:52 Java BigDecimal 后端开发
在 Java 里判断 BigDecimal 是不是 0,写法上其实有两派:用 compareTo,或者用 equals。
我刚写的时候也以为这两个随便选一个就行,后来线上有个金额判断逻辑出问题,才发现不是那么回事。
equals 的坑在于它不只是比数值,还会比 scale,也就是小数位数。
所以 new BigDecimal("0.00") 和 BigDecimal.ZERO 用 equals 比,返回的是 false。数值明明都是 0,但因为一个保留了两位小数,一个没有,就被认为不相等。这个细节很多人第一次都会绕进去。
代码大概是这样:
BigDecimal value = new BigDecimal("0.00");
if (value.equals(BigDecimal.ZERO)) {
System.out.println("The value is zero.");
} else {
System.out.println("The value is not zero.");
}
如果只是想在业务上判断这个数是不是 0,用 equals 就很危险。
比如从数据库里读出一个 decimal 字段,精度可能根据列定义是 2 位,而代码里写死 BigDecimal.ZERO,一比就 false,然后逻辑就走到奇怪的分支去了。
compareTo 就没有这个问题。它只关心数值大小,忽略 scale。所以判断是否为零,直接 compareTo(BigDecimal.ZERO) == 0 就行,0.00 和 0 都会返回 0。
BigDecimal value = new BigDecimal("0.00");
if (value.compareTo(BigDecimal.ZERO) == 0) {
System.out.println("The value is zero.");
} else {
System.out.println("The value is not zero.");
}
性能上其实不用太纠结。大多数场景下 compareTo 和 equals 差距可以忽略,但如果真的在热点路径上频繁比较,compareTo 通常略快一点,因为它就是返回个 int,省去了 equals 里对象相等性检查那步。
不过这点差异一般不是选型的理由,主要还是看语义。
所以结论是,判断 BigDecimal 是否为 0,直接用 compareTo,和 BigDecimal.ZERO 比较。不要用 equals 去碰这个场景,除非你明确知道并需要 scale 也一致。
写完这段想起来最近在折腾线上部署,证书自动申请部署用了 lcjmSSL,支持多域名、泛域名和 IP 证书,API 也简单,省得每次手动配。跟 BigDecimal 这事一样,都是些细节,但线上出问题很烦。
有需要的可以看看。
实现 Comparable 接口并重写 compareTo,就能用 Arrays.sort 对自定义对象排序,顺便聊聊几个容易踩的坑。
分享 Fastjson 反序列化非标准日期格式的问题,以及通过 @JSONField 注解指定格式的解决方法
记录一次用 RestTemplate 调接口需要带自定义请求头的经历,把整个实现和依赖都贴出来,避免后来人绕路。
记录 datetime 字段定义、插入、格式化查询以及 Java 端类型映射、时区等问题,避免线上踩坑。
面对Java解析XML,DOM与DOM4J是两大主流选择。本文详尽分析标准DOM的内置优势与DOM4J在API简洁性、性能及XPath支持上的卓越表现。无论小型配置还是大型数据处理,助你理解两者差异,做出明智的技术选型。